SEO SQUIRRLY™ - Version 5.1.1

Version Description

  • Fixed the feed style issue
  • Added the custom size image for Open Graph in Squirrly Snippet
  • Increased the plugin loading speed in front-end
  • Improved the communication with the API Server
  • Fixed the post optimization history issue
  • Fixed the encryption for the password and fixed the bad login issue
  • Compatible with WP 4.2.2
Download this release

Release Info

Developer cifi
Plugin Icon 128x128 SEO SQUIRRLY™
Version 5.1.1
Comparing to
See all releases

Code changes from version 5.0.1 to 5.1.1

classes/SQ_Action.php CHANGED
@@ -129,16 +129,14 @@ class SQ_Action extends SQ_FrontController {
129
  return false;
130
  }
131
 
132
- $extra = array('user_url' => urlencode(get_bloginfo('wpurl')),
133
  'lang' => (defined('WPLANG') ? WPLANG : 'en_US'),
134
  'versq' => SQ_VERSION_ID,
135
  'verwp' => WP_VERSION_ID,
136
  'verphp' => PHP_VERSION_ID,
137
  'token' => SQ_Tools::$options['sq_api']);
138
 
139
- if ($module <> "") {
140
- $module .= "/";
141
- }
142
 
143
  if (is_array($args)) {
144
  $args = array_merge($args, $extra);
@@ -148,11 +146,10 @@ class SQ_Action extends SQ_FrontController {
148
 
149
  foreach ($args as $key => $value) {
150
  if ($value <> '') {
151
- $parameters .= ($parameters == "" ? "" : "&") . $key . "=" . $value;
152
  }
153
  }
154
 
155
-
156
  /* If the call is for login on register then use base64 is exists */
157
  if ($module == 'sq/login' || $module == 'sq/register') {
158
  if (function_exists('base64_encode')) {
@@ -160,9 +157,11 @@ class SQ_Action extends SQ_FrontController {
160
  }
161
  }
162
 
 
 
 
163
 
164
  $url = self::cleanUrl(_SQ_API_URL_ . $module . "?" . $parameters);
165
- //SQ_Tools::dump($url);
166
  return SQ_Tools::sq_remote_get($url, array(), array('timeout' => $timeout));
167
  }
168
 
129
  return false;
130
  }
131
 
132
+ $extra = array('user_url' => get_bloginfo('wpurl'),
133
  'lang' => (defined('WPLANG') ? WPLANG : 'en_US'),
134
  'versq' => SQ_VERSION_ID,
135
  'verwp' => WP_VERSION_ID,
136
  'verphp' => PHP_VERSION_ID,
137
  'token' => SQ_Tools::$options['sq_api']);
138
 
139
+
 
 
140
 
141
  if (is_array($args)) {
142
  $args = array_merge($args, $extra);
146
 
147
  foreach ($args as $key => $value) {
148
  if ($value <> '') {
149
+ $parameters .= ($parameters == "" ? "" : "&") . $key . "=" . urlencode($value);
150
  }
151
  }
152
 
 
153
  /* If the call is for login on register then use base64 is exists */
154
  if ($module == 'sq/login' || $module == 'sq/register') {
155
  if (function_exists('base64_encode')) {
157
  }
158
  }
159
 
160
+ if ($module <> "") {
161
+ $module .= "/";
162
+ }
163
 
164
  $url = self::cleanUrl(_SQ_API_URL_ . $module . "?" . $parameters);
 
165
  return SQ_Tools::sq_remote_get($url, array(), array('timeout' => $timeout));
166
  }
167
 
classes/SQ_FrontController.php CHANGED
@@ -30,8 +30,7 @@ class SQ_FrontController {
30
 
31
  //IMPORTANT TO LOAD HOOKS HERE
32
  /* check if there is a hook defined in the controller clients class */
33
- SQ_ObjController::getController('SQ_HookController', false)
34
- ->setAdminHooks($this);
35
  }
36
 
37
  /**
@@ -68,9 +67,6 @@ class SQ_FrontController {
68
  * @return void
69
  */
70
  public function run() {
71
- /** check the admin condition */
72
- if (!is_admin())
73
- return;
74
 
75
  /* Load error class */
76
  SQ_ObjController::getController('SQ_Error', false);
30
 
31
  //IMPORTANT TO LOAD HOOKS HERE
32
  /* check if there is a hook defined in the controller clients class */
33
+ SQ_ObjController::getController('SQ_HookController', false)->setAdminHooks($this);
 
34
  }
35
 
36
  /**
67
  * @return void
68
  */
69
  public function run() {
 
 
 
70
 
71
  /* Load error class */
72
  SQ_ObjController::getController('SQ_Error', false);
classes/SQ_HookController.php CHANGED
@@ -7,7 +7,6 @@ class SQ_HookController {
7
 
8
  /** @var array the WP actions list from admin */
9
  private $admin_hooks = array();
10
- private $custom_hooks = array();
11
  private $block_hooks = array();
12
 
13
  public function __construct() {
@@ -37,8 +36,6 @@ class SQ_HookController {
37
  foreach ($this->admin_hooks as $hook => $value) {
38
 
39
  if (is_callable(array($instance, 'hook' . ucfirst($hook)))) {
40
- //echo $value . '<br>';
41
- //print_r(array($instance, 'hook'.ucfirst($hook)));
42
  //call the WP add_action function
43
  add_action($value, array($instance, 'hook' . ucfirst($hook)), 5);
44
  }
7
 
8
  /** @var array the WP actions list from admin */
9
  private $admin_hooks = array();
 
10
  private $block_hooks = array();
11
 
12
  public function __construct() {
36
  foreach ($this->admin_hooks as $hook => $value) {
37
 
38
  if (is_callable(array($instance, 'hook' . ucfirst($hook)))) {
 
 
39
  //call the WP add_action function
40
  add_action($value, array($instance, 'hook' . ucfirst($hook)), 5);
41
  }
classes/SQ_Tools.php CHANGED
@@ -137,8 +137,8 @@ class SQ_Tools extends SQ_FrontController {
137
  'sq_linkedin_account' => '',
138
  // --
139
  'sq_auto_seo' => 1,
140
- 'sq_auto_title' => 0,
141
- 'sq_auto_description' => 0,
142
  'sq_fp_title' => '',
143
  'sq_fp_description' => '',
144
  'sq_fp_keywords' => '',
@@ -194,8 +194,8 @@ class SQ_Tools extends SQ_FrontController {
194
  'sq_auto_twitter' => SQ_Tools::$options['sq_auto_twitter'],
195
  'sq_auto_facebook' => SQ_Tools::$options['sq_auto_facebook'],
196
  'sq_auto_seo' => SQ_Tools::$options['sq_auto_seo'],
197
- 'sq_auto_title' => (int) (SQ_Tools::$options['sq_auto_title'] && SQ_Tools::$options['sq_fp_title'] <> ''),
198
- 'sq_auto_description' => (int) (SQ_Tools::$options['sq_auto_description'] && SQ_Tools::$options['sq_fp_description'] <> ''),
199
  'sq_google_plus' => (int) (SQ_Tools::$options['sq_google_plus'] <> ''),
200
  'sq_google_wt' => (int) (SQ_Tools::$options['sq_google_wt'] <> ''),
201
  'sq_google_analytics' => (int) (SQ_Tools::$options['sq_google_analytics'] <> ''),
@@ -339,11 +339,15 @@ class SQ_Tools extends SQ_FrontController {
339
  }
340
  $options['sslverify'] = false;
341
 
342
- if (function_exists('curl_init') && !ini_get('safe_mode') && !ini_get('open_basedir')) {
343
- return self::sq_curl($url, $options);
344
- } else {
345
- return self::sq_wpcall($url, $options);
 
 
346
  }
 
 
347
  }
348
 
349
  /**
@@ -364,7 +368,7 @@ class SQ_Tools extends SQ_FrontController {
364
  curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
365
  curl_setopt($ch, CURLOPT_TIMEOUT, $options['timeout']);
366
 
367
- if (isset($options['followlocation']) ) {
368
  curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
369
  curl_setopt($ch, CURLOPT_MAXREDIRS, 1);
370
  }
@@ -398,6 +402,11 @@ class SQ_Tools extends SQ_FrontController {
398
  */
399
  private static function sq_wpcall($url, $options) {
400
  $response = wp_remote_get($url, $options);
 
 
 
 
 
401
  $response = self::cleanResponce(wp_remote_retrieve_body($response)); //clear and get the body
402
  self::dump('wp_remote_get', $url, $options, $response); //output debug
403
  return $response;
@@ -773,10 +782,10 @@ class SQ_Tools extends SQ_FrontController {
773
  $snippet['title'] = self::i18n(trim(strip_tags($snippet['title'])));
774
  }
775
 
776
- $description_regex = '/<meta[^<>]*description[^<>]*content="([^"<>]+)"[^<>]*>/si';
777
  preg_match($description_regex, self::$source_code, $description);
778
  if (is_array($description) && count($description) > 0) {
779
- $snippet['description'] = self::i18n(trim(strip_tags($description[1])));
780
 
781
  if (strlen($snippet['description']) > $length['description'])
782
  $snippet['description'] = substr($snippet['description'], 0, ($length['description'] - 1)) . '...';
137
  'sq_linkedin_account' => '',
138
  // --
139
  'sq_auto_seo' => 1,
140
+ 'sq_auto_title' => 1,
141
+ 'sq_auto_description' => 1,
142
  'sq_fp_title' => '',
143
  'sq_fp_description' => '',
144
  'sq_fp_keywords' => '',
194
  'sq_auto_twitter' => SQ_Tools::$options['sq_auto_twitter'],
195
  'sq_auto_facebook' => SQ_Tools::$options['sq_auto_facebook'],
196
  'sq_auto_seo' => SQ_Tools::$options['sq_auto_seo'],
197
+ 'sq_auto_title' => (int) (SQ_Tools::$options['sq_auto_title'] == 1 && SQ_Tools::$options['sq_fp_title'] <> ''),
198
+ 'sq_auto_description' => (int) (SQ_Tools::$options['sq_auto_description'] == 1 && SQ_Tools::$options['sq_fp_description'] <> ''),
199
  'sq_google_plus' => (int) (SQ_Tools::$options['sq_google_plus'] <> ''),
200
  'sq_google_wt' => (int) (SQ_Tools::$options['sq_google_wt'] <> ''),
201
  'sq_google_analytics' => (int) (SQ_Tools::$options['sq_google_analytics'] <> ''),
339
  }
340
  $options['sslverify'] = false;
341
 
342
+ if (!$response = self::sq_wpcall($url, $options)) {
343
+ if (function_exists('curl_init') && !ini_get('safe_mode') && !ini_get('open_basedir')) {
344
+ $response = self::sq_curl($url, $options);
345
+ } else {
346
+ return false;
347
+ }
348
  }
349
+
350
+ return $response;
351
  }
352
 
353
  /**
368
  curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
369
  curl_setopt($ch, CURLOPT_TIMEOUT, $options['timeout']);
370
 
371
+ if (isset($options['followlocation'])) {
372
  curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
373
  curl_setopt($ch, CURLOPT_MAXREDIRS, 1);
374
  }
402
  */
403
  private static function sq_wpcall($url, $options) {
404
  $response = wp_remote_get($url, $options);
405
+ if (is_wp_error($response)) {
406
+ self::dump($response);
407
+ return false;
408
+ }
409
+
410
  $response = self::cleanResponce(wp_remote_retrieve_body($response)); //clear and get the body
411
  self::dump('wp_remote_get', $url, $options, $response); //output debug
412
  return $response;
782
  $snippet['title'] = self::i18n(trim(strip_tags($snippet['title'])));
783
  }
784
 
785
+ $description_regex = '/<meta[^>]*(name|property)=["\']description["\'][^>]*content="([^"<>]+)"[^<>]*>/si';
786
  preg_match($description_regex, self::$source_code, $description);
787
  if (is_array($description) && count($description) > 0) {
788
+ $snippet['description'] = self::i18n(trim(strip_tags($description[2])));
789
 
790
  if (strlen($snippet['description']) > $length['description'])
791
  $snippet['description'] = substr($snippet['description'], 0, ($length['description'] - 1)) . '...';
config/config.php CHANGED
@@ -30,4 +30,3 @@ require_once(dirname(__FILE__) . '/paths.php');
30
 
31
  /* Define the record name in the Option and UserMeta tables */
32
  define('SQ_OPTION', 'sq_options');
33
- ?>
30
 
31
  /* Define the record name in the Option and UserMeta tables */
32
  define('SQ_OPTION', 'sq_options');
 
config/paths.php CHANGED
@@ -15,10 +15,8 @@ defined('_SQ_API_URL_') || define('_SQ_API_URL_', $scheme . '//api.squirrly.co/'
15
  defined('_SQ_STATIC_API_URL_') || define('_SQ_STATIC_API_URL_', $scheme . '//api.squirrly.co/static/');
16
  defined('_SQ_SUPPORT_URL_') || define('_SQ_SUPPORT_URL_', 'https://plus.google.com/u/0/communities/104196720668136264985');
17
 
18
-
19
  /* Directories */
20
- define('_SQ_ROOT_DIR_', realpath($currentDir . '/..'));
21
- define('_SQ_CACHE_DIR_', _SQ_ROOT_DIR_ . '/cache/');
22
  define('_SQ_CLASSES_DIR_', _SQ_ROOT_DIR_ . '/classes/');
23
  define('_SQ_CONTROLLER_DIR_', _SQ_ROOT_DIR_ . '/controllers/');
24
  define('_SQ_MODEL_DIR_', _SQ_ROOT_DIR_ . '/models/');
@@ -28,8 +26,27 @@ define('_SQ_ALL_THEMES_DIR_', _SQ_ROOT_DIR_ . '/themes/');
28
  define('_SQ_THEME_DIR_', _SQ_ROOT_DIR_ . '/themes/' . _THEME_NAME_ . '/');
29
 
30
  /* URLS */
31
- define('_SQ_URL_', plugins_url('', dirname(__FILE__)));
32
- define('_SQ_CACHE_URL_', _SQ_URL_ . '/cache/');
33
  define('_SQ_ALL_THEMES_URL_', _SQ_URL_ . '/themes/');
34
  define('_SQ_THEME_URL_', _SQ_URL_ . '/themes/' . _THEME_NAME_ . '/');
35
- ?>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
15
  defined('_SQ_STATIC_API_URL_') || define('_SQ_STATIC_API_URL_', $scheme . '//api.squirrly.co/static/');
16
  defined('_SQ_SUPPORT_URL_') || define('_SQ_SUPPORT_URL_', 'https://plus.google.com/u/0/communities/104196720668136264985');
17
 
 
18
  /* Directories */
19
+ define('_SQ_ROOT_DIR_', realpath(dirname($currentDir)));
 
20
  define('_SQ_CLASSES_DIR_', _SQ_ROOT_DIR_ . '/classes/');
21
  define('_SQ_CONTROLLER_DIR_', _SQ_ROOT_DIR_ . '/controllers/');
22
  define('_SQ_MODEL_DIR_', _SQ_ROOT_DIR_ . '/models/');
26
  define('_SQ_THEME_DIR_', _SQ_ROOT_DIR_ . '/themes/' . _THEME_NAME_ . '/');
27
 
28
  /* URLS */
29
+ define('_SQ_URL_', plugins_url('', $currentDir));
 
30
  define('_SQ_ALL_THEMES_URL_', _SQ_URL_ . '/themes/');
31
  define('_SQ_THEME_URL_', _SQ_URL_ . '/themes/' . _THEME_NAME_ . '/');
32
+
33
+
34
+ $upload_dir = wp_upload_dir();
35
+ if (is_dir($upload_dir['basedir'])) {
36
+ $upload_path = $upload_dir['basedir'] . '/' . _SQ_NAME_ . '/';
37
+
38
+ //create directory if doesn't exists
39
+ if (!is_dir($upload_path)) {
40
+ wp_mkdir_p($upload_path);
41
+ }
42
+
43
+ if (is_dir($upload_path) && wp_is_writable($upload_path)) {
44
+ define('_SQ_CACHE_DIR_', realpath($upload_path) . '/');
45
+ define('_SQ_CACHE_URL_', $upload_dir['baseurl'] . '/' . _SQ_NAME_ . '/');
46
+ }
47
+ }
48
+
49
+ defined('_SQ_CACHE_DIR_') || define('_SQ_CACHE_DIR_', _SQ_ROOT_DIR_ . '/cache/');
50
+ defined('_SQ_CACHE_URL_') || define('_SQ_CACHE_URL_', _SQ_URL_ . '/cache/');
51
+
52
+
controllers/SQ_Frontend.php CHANGED
@@ -20,6 +20,7 @@ class SQ_Frontend extends SQ_FrontController {
20
 
21
  //validate custom arguments for favicon and sitemap
22
  add_filter('query_vars', array($this, 'validateParams'), 1, 1);
 
23
  }
24
 
25
  private function _isAjax() {
@@ -29,6 +30,19 @@ class SQ_Frontend extends SQ_FrontController {
29
  return false;
30
  }
31
 
 
 
 
 
 
 
 
 
 
 
 
 
 
32
  /**
33
  * Called after plugins are loaded
34
  */
@@ -39,19 +53,6 @@ class SQ_Frontend extends SQ_FrontController {
39
  SQ_Tools::$options['sq_use'] = 0;
40
  }
41
 
42
-
43
- if (SQ_Tools::$options['sq_use'] == 1) {
44
- if ($this->_isAjax()) {
45
- return;
46
- }
47
-
48
- add_filter('sq_title', array($this->model, 'clearTitle'));
49
- add_filter('sq_description', array($this->model, 'clearDescription'));
50
-
51
- //Use buffer only for meta Title
52
- $this->model->startBuffer();
53
- }
54
-
55
  //Check for sitemap and robots
56
  if (SQ_Tools::$options['sq_use'] == 1) {
57
  if (isset($_SERVER['REQUEST_URI']) && SQ_Tools::$options['sq_auto_robots'] == 1) {
@@ -89,50 +90,48 @@ class SQ_Frontend extends SQ_FrontController {
89
  * Change the image path to absolute when in feed
90
  */
91
  public function hookFrontcontent($content) {
92
- if (!is_feed())
93
- return $content;
94
 
 
 
95
 
96
- $find = $replace = $urls = array();
97
-
98
- @preg_match_all('/<img[^>]*src="([^"]+)"[^>]*>/i', $content, $out);
99
- if (is_array($out)) {
100
- if (!is_array($out[1]) || empty($out[1]))
101
- return $content;
102
 
103
- foreach ($out[1] as $row) {
104
- if (strpos($row, '//') === false) {
105
- if (!in_array($row, $urls)) {
106
- $urls[] = $row;
 
107
  }
108
  }
109
  }
110
- }
111
 
112
- @preg_match_all('/<a[^>]*href="([^"]+)"[^>]*>/i', $content, $out);
113
- if (is_array($out)) {
114
- if (!is_array($out[1]) || empty($out[1]))
115
- return $content;
116
 
117
- foreach ($out[1] as $row) {
118
- if (strpos($row, '//') === false) {
119
- if (!in_array($row, $urls)) {
120
- $urls[] = $row;
 
121
  }
122
  }
123
  }
124
- }
125
- if (!is_array($urls) || (is_array($urls) && empty($urls)))
126
- return $content;
127
 
128
- foreach ($urls as $url) {
129
- $find[] = $url;
130
- $replace[] = get_bloginfo('url') . $url;
131
- }
132
- if (!empty($find) && !empty($replace)) {
133
- $content = str_replace($find, $replace, $content);
 
134
  }
135
-
136
  return $content;
137
  }
138
 
20
 
21
  //validate custom arguments for favicon and sitemap
22
  add_filter('query_vars', array($this, 'validateParams'), 1, 1);
23
+ add_action('template_redirect', array($this, 'startBuffer'), 0);
24
  }
25
 
26
  private function _isAjax() {
30
  return false;
31
  }
32
 
33
+ public function startBuffer() {
34
+ if ($this->_isAjax()) {
35
+ return;
36
+ }
37
+
38
+ if (SQ_Tools::$options['sq_use'] == 1) {
39
+ add_filter('sq_title', array($this->model, 'clearTitle'));
40
+ add_filter('sq_description', array($this->model, 'clearDescription'));
41
+ //Use buffer only for meta Title
42
+ $this->model->startBuffer();
43
+ }
44
+ }
45
+
46
  /**
47
  * Called after plugins are loaded
48
  */
53
  SQ_Tools::$options['sq_use'] = 0;
54
  }
55
 
 
 
 
 
 
 
 
 
 
 
 
 
 
56
  //Check for sitemap and robots
57
  if (SQ_Tools::$options['sq_use'] == 1) {
58
  if (isset($_SERVER['REQUEST_URI']) && SQ_Tools::$options['sq_auto_robots'] == 1) {
90
  * Change the image path to absolute when in feed
91
  */
92
  public function hookFrontcontent($content) {
 
 
93
 
94
+ if (is_feed() && SQ_Tools::$options['sq_local_images'] == 1) {
95
+ $find = $replace = $urls = array();
96
 
97
+ @preg_match_all('/<img[^>]*src=[\'"]([^\'"]+)[\'"][^>]*>/i', $content, $out);
98
+ if (is_array($out)) {
99
+ if (!is_array($out[1]) || empty($out[1]))
100
+ return $content;
 
 
101
 
102
+ foreach ($out[1] as $row) {
103
+ if (strpos($row, '//') === false) {
104
+ if (!in_array($row, $urls)) {
105
+ $urls[] = $row;
106
+ }
107
  }
108
  }
109
  }
 
110
 
111
+ @preg_match_all('/<a[^>]*href=[\'"]([^\'"]+)[\'"][^>]*>/i', $content, $out);
112
+ if (is_array($out)) {
113
+ if (!is_array($out[1]) || empty($out[1]))
114
+ return $content;
115
 
116
+ foreach ($out[1] as $row) {
117
+ if (strpos($row, '//') === false) {
118
+ if (!in_array($row, $urls)) {
119
+ $urls[] = $row;
120
+ }
121
  }
122
  }
123
  }
124
+ if (!is_array($urls) || (is_array($urls) && empty($urls)))
125
+ return $content;
 
126
 
127
+ foreach ($urls as $url) {
128
+ $find[] = $url;
129
+ $replace[] = get_bloginfo('url') . $url;
130
+ }
131
+ if (!empty($find) && !empty($replace)) {
132
+ $content = str_replace($find, $replace, $content);
133
+ }
134
  }
 
135
  return $content;
136
  }
137
 
controllers/SQ_Post.php CHANGED
@@ -65,6 +65,7 @@ class SQ_Post extends SQ_FrontController {
65
  * @param type $post_id
66
  */
67
  public function hookSavePost($post_id) {
 
68
  $file_name = false;
69
  if (!isset($this->saved[$post_id]))
70
  $this->saved[$post_id] = false;
@@ -100,19 +101,22 @@ class SQ_Post extends SQ_FrontController {
100
  * @return false|void
101
  */
102
  public function checkImage($post_id) {
 
103
  //if the option to save the images locally is set on
104
  if (SQ_Tools::$options['sq_local_images'] == 1) {
 
105
  @set_time_limit(90);
106
  $local_file = false;
107
 
108
- $content = stripslashes(SQ_Tools::getValue('post_content'));
109
- $tmpcontent = trim($content, "\n");
110
  $urls = array();
111
 
112
  if (function_exists('preg_match_all')) {
113
- @preg_match_all('/<img[^>]*src="([^"]+)"[^>]*>/i', $tmpcontent, $out);
114
 
 
115
  if (is_array($out)) {
 
116
  if (!is_array($out[1]) || count($out[1]) == 0)
117
  return;
118
 
@@ -120,7 +124,7 @@ class SQ_Post extends SQ_FrontController {
120
  $domain = parse_url(get_bloginfo('wpurl'));
121
 
122
  foreach ($out[1] as $row) {
123
- if (strpos($row, 'http') !== false &&
124
  strpos($row, $domain['host']) === false) {
125
  if (!in_array($row, $urls)) {
126
  $urls[] = $row;
@@ -135,6 +139,7 @@ class SQ_Post extends SQ_FrontController {
135
  return;
136
 
137
  $urls = @array_unique($urls);
 
138
  $time = microtime(true);
139
  foreach ($urls as $url) {
140
  if ($file = $this->model->upload_image($url)) {
@@ -191,13 +196,18 @@ class SQ_Post extends SQ_FrontController {
191
  $args['status'] = $status;
192
  $args['permalink'] = get_permalink($post_id);
193
  $args['permalink'] = $this->getPaged($args['permalink']);
194
- $args['permalink'] = urlencode($args['permalink']);
195
  $args['author'] = (int) SQ_Tools::getUserID();
196
  $args['post_id'] = $post_id;
197
 
 
 
 
 
 
198
  //save for later send to api
199
- set_transient('sq_seopost', json_encode($args));
200
-
201
  //Save the keyword for this post
202
  if ($json = $this->model->getKeyword($post_id)) {
203
  $json->keyword = SQ_Tools::getValue('sq_keyword');
@@ -303,9 +313,22 @@ class SQ_Post extends SQ_FrontController {
303
  }
304
 
305
  public function hookFooter() {
 
 
 
 
 
 
 
306
  if (get_transient('sq_seopost') !== false) {
307
- SQ_Action::apiCall('sq/seo/post', (array) json_decode(get_transient('sq_seopost')), 30);
308
- delete_transient('sq_seopost');
 
 
 
 
 
 
309
  }
310
  }
311
 
65
  * @param type $post_id
66
  */
67
  public function hookSavePost($post_id) {
68
+
69
  $file_name = false;
70
  if (!isset($this->saved[$post_id]))
71
  $this->saved[$post_id] = false;
101
  * @return false|void
102
  */
103
  public function checkImage($post_id) {
104
+
105
  //if the option to save the images locally is set on
106
  if (SQ_Tools::$options['sq_local_images'] == 1) {
107
+
108
  @set_time_limit(90);
109
  $local_file = false;
110
 
111
+ $content = SQ_Tools::getValue('post_content', '', true); //get the content in html format
112
+ $tmpcontent = trim(html_entity_decode($content), "\n");
113
  $urls = array();
114
 
115
  if (function_exists('preg_match_all')) {
 
116
 
117
+ @preg_match_all('/<img[^>]*src=[\'"]([^\'"]+)[\'"][^>]*>/i', $tmpcontent, $out);
118
  if (is_array($out)) {
119
+
120
  if (!is_array($out[1]) || count($out[1]) == 0)
121
  return;
122
 
124
  $domain = parse_url(get_bloginfo('wpurl'));
125
 
126
  foreach ($out[1] as $row) {
127
+ if (strpos($row, '//') !== false &&
128
  strpos($row, $domain['host']) === false) {
129
  if (!in_array($row, $urls)) {
130
  $urls[] = $row;
139
  return;
140
 
141
  $urls = @array_unique($urls);
142
+
143
  $time = microtime(true);
144
  foreach ($urls as $url) {
145
  if ($file = $this->model->upload_image($url)) {
196
  $args['status'] = $status;
197
  $args['permalink'] = get_permalink($post_id);
198
  $args['permalink'] = $this->getPaged($args['permalink']);
199
+ $args['permalink'] = $args['permalink'];
200
  $args['author'] = (int) SQ_Tools::getUserID();
201
  $args['post_id'] = $post_id;
202
 
203
+ $process = array();
204
+ if (get_transient('sq_seopost') !== false) {
205
+ $process = json_decode(get_transient('sq_seopost'), true);
206
+ }
207
+ $process[] = $args;
208
  //save for later send to api
209
+ set_transient('sq_seopost', json_encode($process));
210
+ wp_schedule_single_event(time() + 60, 'sq_processApi');
211
  //Save the keyword for this post
212
  if ($json = $this->model->getKeyword($post_id)) {
213
  $json->keyword = SQ_Tools::getValue('sq_keyword');
313
  }
314
 
315
  public function hookFooter() {
316
+ $this->processCron();
317
+ }
318
+
319
+ public function processCron() {
320
+ SQ_ObjController::getController('SQ_Tools', false);
321
+ SQ_ObjController::getController('SQ_Action', false);
322
+
323
  if (get_transient('sq_seopost') !== false) {
324
+ $process = json_decode(get_transient('sq_seopost'), true);
325
+ foreach ($process as $key => $call) {
326
+ $response = json_decode(SQ_Action::apiCall('sq/seo/post', $call, 60));
327
+ if (isset($response->saved) && $response->saved == true) {
328
+ unset($process[$key]);
329
+ }
330
+ }
331
+ set_transient('sq_seopost', json_encode($process));
332
  }
333
  }
334
 
controllers/SQ_Sitemaps.php CHANGED
@@ -17,6 +17,25 @@ class SQ_Sitemaps extends SQ_FrontController {
17
  add_filter('request', array($this, 'feedRequest'));
18
  add_filter('user_trailingslashit', array($this, 'untrailingslashit'));
19
  add_action('sq_processPing', array($this, 'processCron'));
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
20
  }
21
 
22
  public function refreshSitemap($new_status, $old_status, $post) {
@@ -281,10 +300,10 @@ class SQ_Sitemaps extends SQ_FrontController {
281
  * @return string
282
  */
283
  public function getXmlUrl($sitemap) {
284
- if (!get_option('permalink_structure')){
285
  $sitemap = '?feed=' . str_replace('.xml', '', $sitemap);
286
- }else{
287
- if(isset(SQ_Tools::$options['sq_sitemap'][$sitemap])){
288
  $sitemap = SQ_Tools::$options['sq_sitemap'][$sitemap][0];
289
  }
290
 
@@ -386,7 +405,7 @@ class SQ_Sitemaps extends SQ_FrontController {
386
  ) p ON (wp_users.ID = p.post_author)';
387
  $query->query_where .= ' AND post_count > 0 ';
388
  }
389
-
390
  function customPostFilter($query) {
391
  $types = get_post_types();
392
  foreach (array('post', 'page', 'attachment', 'revision', 'nav_menu_item', 'product', 'wpsc-product') as $exclude) {
17
  add_filter('request', array($this, 'feedRequest'));
18
  add_filter('user_trailingslashit', array($this, 'untrailingslashit'));
19
  add_action('sq_processPing', array($this, 'processCron'));
20
+ //add_action('rss_tag_pre', array($this, 'rssStyle'));
21
+ // add_filter('feed_content_type', array($this, 'feedHeader'), 10, 2);
22
+ }
23
+
24
+ public function rssStyle() {
25
+ echo '<?xml-stylesheet type="text/xml" href="' . _SQ_THEME_URL_ . 'css/sq_feed.xsl' . '" media="screen" ?>';
26
+ }
27
+
28
+ public function feedHeader($content_type, $type) {
29
+ if (empty($type))
30
+ $type = get_default_feed();
31
+ $types = array(
32
+ 'rss' => 'application/rss+xml',
33
+ 'rss2' => 'application/rss+xml',
34
+ 'rss-http' => 'text/xml',
35
+ 'atom' => 'application/xml',
36
+ 'rdf' => 'application/rdf+xml'
37
+ );
38
+ $content_type = (!empty($types[$type]) ) ? $types[$type] : 'application/octet-stream';
39
  }
40
 
41
  public function refreshSitemap($new_status, $old_status, $post) {
300
  * @return string
301
  */
302
  public function getXmlUrl($sitemap) {
303
+ if (!get_option('permalink_structure')) {
304
  $sitemap = '?feed=' . str_replace('.xml', '', $sitemap);
305
+ } else {
306
+ if (isset(SQ_Tools::$options['sq_sitemap'][$sitemap])) {
307
  $sitemap = SQ_Tools::$options['sq_sitemap'][$sitemap][0];
308
  }
309
 
405
  ) p ON (wp_users.ID = p.post_author)';
406
  $query->query_where .= ' AND post_count > 0 ';
407
  }
408
+
409
  function customPostFilter($query) {
410
  $types = get_post_types();
411
  foreach (array('post', 'page', 'attachment', 'revision', 'nav_menu_item', 'product', 'wpsc-product') as $exclude) {
core/SQ_Blocklogin/SQ_Blocklogin.php CHANGED
@@ -105,10 +105,10 @@ class SQ_Blocklogin extends SQ_BlockController {
105
  $responce = '';
106
 
107
  //get the user and password
108
- $args['user'] = SQ_Tools::getValue('user');
109
- $args['password'] = SQ_Tools::getValue('password');
 
110
  if ($args['user'] <> '' && $args['password'] <> '') {
111
- $args['encrypted'] = '0';
112
  //get the responce from server on login call
113
  $responce = SQ_Action::apiCall('sq/login', $args);
114
 
105
  $responce = '';
106
 
107
  //get the user and password
108
+ $args['user'] = SQ_Tools::getValue('user', null, true);
109
+ $args['password'] = SQ_Tools::getValue('password', null, true);
110
+
111
  if ($args['user'] <> '' && $args['password'] <> '') {
 
112
  //get the responce from server on login call
113
  $responce = SQ_Action::apiCall('sq/login', $args);
114
 
models/SQ_BlockSettingsSeo.php CHANGED
@@ -308,9 +308,14 @@ class Model_SQ_BlockSettingsSeo {
308
  SQ_Error::setError(__("ICO Error: Could not create the ICO from file. Try with another file type.", _SQ_PLUGIN_NAME_));
309
  }
310
  } else {
311
- copy($out['tmp'],$out['favicon']);
 
 
 
 
312
  unset($out['tmp']);
313
  if (file_exists($path . "/" . 'favicon.ico')) {
 
314
  $ico->remove_ico($path . "/" . 'favicon.ico');
315
  }
316
  }
308
  SQ_Error::setError(__("ICO Error: Could not create the ICO from file. Try with another file type.", _SQ_PLUGIN_NAME_));
309
  }
310
  } else {
311
+ copy($out['tmp'], $out['favicon']);
312
+ foreach ($this->appleSizes as $size) {
313
+ copy($out['tmp'], $out['favicon' . $size]);
314
+ }
315
+
316
  unset($out['tmp']);
317
  if (file_exists($path . "/" . 'favicon.ico')) {
318
+ $ico = SQ_ObjController::getModel('SQ_Ico');
319
  $ico->remove_ico($path . "/" . 'favicon.ico');
320
  }
321
  }
models/SQ_Frontend.php CHANGED
@@ -117,10 +117,10 @@ class Model_SQ_Frontend {
117
  } elseif (isset($post->ID)) {
118
  $this->post = get_post($post->ID);
119
  }
120
-
121
  if ($this->isHomePage() || is_single() || is_preview() || is_page() || is_archive() || is_author() || is_category() || is_tag() || is_search() || in_array(get_post_type(), $this->post_type)) {
122
  preg_match("/<head[^>]*>/i", $buffer, $out);
123
  if (!empty($out)) {
 
124
  $this->title = $this->getCustomTitle();
125
  if (isset($this->title) && $this->title <> '') {
126
  //replace the existing title
@@ -132,14 +132,21 @@ class Model_SQ_Frontend {
132
 
133
  if ((SQ_Tools::$options['sq_auto_description'] == 1 && $this->isHomePage()) || !$this->isHomePage()) {
134
  //clear the existing description and keywords
135
- $buffer = @preg_replace('/<meta[^>]*(name|property)=\"(description|keywords)\"[^>]*content=["\'][^"\'>]*["\'][^>]*>[\n\r]*/si', '', $buffer, -1);
136
  }
137
  if (SQ_Tools::$options['sq_auto_facebook'] == 1) {
138
- $buffer = @preg_replace('/<meta[^>]*(name|property)=["\'](og:|article:|twitter:)[^"\'>]+["\'][^>]*content=["\'][^"\'>]+["\'][^>]*>[\n\r]*/si', '', $buffer, -1);
139
  }
140
  if (SQ_Tools::$options['sq_auto_twitter'] == 1) {
141
  $buffer = @preg_replace('/<meta[^>]*(name|property)=["\'](twitter:)[^"\'>]+["\'][^>]*content=["\'][^"\'>]+["\'][^>]*>[\n\r]*/si', '', $buffer, -1);
142
  }
 
 
 
 
 
 
 
143
  }
144
  }
145
  return $buffer;
@@ -430,43 +437,41 @@ class Model_SQ_Frontend {
430
  $tag = get_query_var('tag');
431
  $title = ucfirst(str_replace('-', ' ', $tag)) . $sep . __('Page', _SQ_PLUGIN_NAME_) . " " . get_query_var('paged');
432
  }
433
- }elseif (is_archive()) { //for archive and products
434
  if (isset($this->post) && isset($this->post->ID)) {
435
  $title = $this->grabTitleFromPost($this->post->ID);
436
 
437
  //if woocommerce is installed and is a product category
438
- if (function_exists('is_product_category') && is_product_category()){
439
  global $wp_query;
440
  $cat = $wp_query->get_queried_object();
441
- if (!empty($cat)){
442
  $title .= $sep . $cat->name;
443
  }
444
- }else{
445
- $cat = get_the_terms( $this->post->ID, 'category' );
446
- if (!empty($cat)){
447
  $title .= $sep . $cat[0]->name;
448
  }
449
  }
450
  }
451
 
452
  if (is_paged()) {
453
- $title .= $sep . __('Page', _SQ_PLUGIN_NAME_) . " " . get_query_var('paged');
454
  }
455
  } elseif (is_single() || is_page() || is_singular() || in_array(get_post_type(), $this->post_type)) {
456
  if (isset($this->post) && isset($this->post->ID)) {
457
- //is a post page
458
  $title = $this->grabTitleFromPost($this->post->ID);
459
 
460
- //if woocommerce is installed and is a product
461
- if (function_exists('is_product') && is_product()){
462
- $cat = get_the_terms( $this->post->ID, 'product_cat' );
463
- if (!empty($cat) && count($cat) > 1){
464
  $title .= $sep . $cat[0]->name;
465
  }
466
  }
467
  }
468
-
469
-
470
  }
471
  }
472
 
@@ -615,15 +620,14 @@ class Model_SQ_Frontend {
615
  }
616
 
617
  if (is_paged()) {
618
- $description .= $sep . __('Page', _SQ_PLUGIN_NAME_) . " " . get_query_var('paged');
619
  }
620
 
621
  if ($this->isHomePage() && $description <> '') {
622
  if ($this->meta['blogname'] <> '') {
623
- $description .= $sep . $this->meta['blogname'];
624
  }
625
  }
626
-
627
  } elseif (is_author()) { //for author
628
  $description = $this->getAuthor('user_description');
629
  if ($description == '') {
@@ -642,25 +646,22 @@ class Model_SQ_Frontend {
642
  $description .= $sep . __('Page', _SQ_PLUGIN_NAME_) . " " . get_query_var('paged');
643
  }
644
  } elseif (is_archive()) { //for archive and products
645
-
646
  if (isset($this->post) && isset($this->post->ID)) {
647
  $description = $this->grabDescriptionFromPost($this->post->ID);
648
 
649
  //if woocommerce is installed and is a product category
650
- if (function_exists('is_product_category') && is_product_category()){
651
  global $wp_query;
652
  $cat = $wp_query->get_queried_object();
653
- if (!empty($cat)){
654
- $description .= $sep . $cat->name ;
655
  }
656
-
657
- }else{
658
- $cat = get_the_terms( $this->post->ID, 'category' );
659
- if (!empty($cat)){
660
  $description .= $sep . $cat[0]->name;
661
  }
662
  }
663
-
664
  }
665
 
666
  if (is_paged()) {
@@ -672,13 +673,12 @@ class Model_SQ_Frontend {
672
  $description .= $this->grabDescriptionFromPost($this->post->ID);
673
 
674
  //if woocommerce is installed and is a product
675
- if (function_exists('is_product') && is_product()){
676
- $cat = get_the_terms( $this->post->ID, 'product_cat' );
677
- if (!empty($cat) && count($cat) > 1){
678
  $description .= $sep . $cat[0]->name;
679
  }
680
  }
681
-
682
  }
683
  }
684
  }
@@ -823,7 +823,7 @@ class Model_SQ_Frontend {
823
  $favicon = get_bloginfo('wpurl') . '/touch-icon' . $size . '.png' . $rnd;
824
  $meta .= sprintf("<link rel=\"apple-touch-icon\" sizes=\"" . $size . "x" . $size . "\" href=\"%s\" />" . "\n", $favicon);
825
  }
826
- }else{
827
  if (file_exists(ABSPATH . 'favicon.ico')) {
828
  $meta .= sprintf("<link rel=\"shortcut icon\" href=\"%s\" />" . "\n", get_bloginfo('wpurl') . '/favicon.ico');
829
  }
117
  } elseif (isset($post->ID)) {
118
  $this->post = get_post($post->ID);
119
  }
 
120
  if ($this->isHomePage() || is_single() || is_preview() || is_page() || is_archive() || is_author() || is_category() || is_tag() || is_search() || in_array(get_post_type(), $this->post_type)) {
121
  preg_match("/<head[^>]*>/i", $buffer, $out);
122
  if (!empty($out)) {
123
+
124
  $this->title = $this->getCustomTitle();
125
  if (isset($this->title) && $this->title <> '') {
126
  //replace the existing title
132
 
133
  if ((SQ_Tools::$options['sq_auto_description'] == 1 && $this->isHomePage()) || !$this->isHomePage()) {
134
  //clear the existing description and keywords
135
+ $buffer = @preg_replace('/<meta[^>]*(name|property)=["\'](description|keywords)["\'][^>]*content=["\'][^"\'>]*["\'][^>]*>[\n\r]*/si', '', $buffer, -1);
136
  }
137
  if (SQ_Tools::$options['sq_auto_facebook'] == 1) {
138
+ $buffer = @preg_replace('/<meta[^>]*(name|property)=["\'](og:|article:)[^"\'>]+["\'][^>]*content=["\'][^"\'>]+["\'][^>]*>[\n\r]*/si', '', $buffer, -1);
139
  }
140
  if (SQ_Tools::$options['sq_auto_twitter'] == 1) {
141
  $buffer = @preg_replace('/<meta[^>]*(name|property)=["\'](twitter:)[^"\'>]+["\'][^>]*content=["\'][^"\'>]+["\'][^>]*>[\n\r]*/si', '', $buffer, -1);
142
  }
143
+
144
+ if (SQ_Tools::$options['sq_auto_canonical'] == 1) {
145
+ $buffer = @preg_replace('/<link[^>]*rel=[^>]*(canonical|prev|next)[^>]*>[\n\r]*/si', '', $buffer, -1);
146
+ }
147
+ if (SQ_Tools::$options['sq_auto_jsonld'] == 1) {
148
+ $buffer = @preg_replace('/<script[^>]*type=["\']application\/ld\+json["\'][^>]*>[^>]*<\/script>[\n\r]*/si', '', $buffer, -1);
149
+ }
150
  }
151
  }
152
  return $buffer;
437
  $tag = get_query_var('tag');
438
  $title = ucfirst(str_replace('-', ' ', $tag)) . $sep . __('Page', _SQ_PLUGIN_NAME_) . " " . get_query_var('paged');
439
  }
440
+ } elseif (is_archive()) { //for archive and products
441
  if (isset($this->post) && isset($this->post->ID)) {
442
  $title = $this->grabTitleFromPost($this->post->ID);
443
 
444
  //if woocommerce is installed and is a product category
445
+ if (function_exists('is_product_category') && is_product_category()) {
446
  global $wp_query;
447
  $cat = $wp_query->get_queried_object();
448
+ if (!empty($cat)) {
449
  $title .= $sep . $cat->name;
450
  }
451
+ } else {
452
+ $cat = get_the_terms($this->post->ID, 'category');
453
+ if (!empty($cat)) {
454
  $title .= $sep . $cat[0]->name;
455
  }
456
  }
457
  }
458
 
459
  if (is_paged()) {
460
+ $title .= $sep . __('Page', _SQ_PLUGIN_NAME_) . " " . get_query_var('paged');
461
  }
462
  } elseif (is_single() || is_page() || is_singular() || in_array(get_post_type(), $this->post_type)) {
463
  if (isset($this->post) && isset($this->post->ID)) {
464
+ //is a post page
465
  $title = $this->grabTitleFromPost($this->post->ID);
466
 
467
+ //if woocommerce is installed and is a product
468
+ if (function_exists('is_product') && is_product()) {
469
+ $cat = get_the_terms($this->post->ID, 'product_cat');
470
+ if (!empty($cat) && count($cat) > 1) {
471
  $title .= $sep . $cat[0]->name;
472
  }
473
  }
474
  }
 
 
475
  }
476
  }
477
 
620
  }
621
 
622
  if (is_paged()) {
623
+ $description .= $sep . __('Page', _SQ_PLUGIN_NAME_) . " " . get_query_var('paged');
624
  }
625
 
626
  if ($this->isHomePage() && $description <> '') {
627
  if ($this->meta['blogname'] <> '') {
628
+ $description .= $sep . $this->meta['blogname'];
629
  }
630
  }
 
631
  } elseif (is_author()) { //for author
632
  $description = $this->getAuthor('user_description');
633
  if ($description == '') {
646
  $description .= $sep . __('Page', _SQ_PLUGIN_NAME_) . " " . get_query_var('paged');
647
  }
648
  } elseif (is_archive()) { //for archive and products
 
649
  if (isset($this->post) && isset($this->post->ID)) {
650
  $description = $this->grabDescriptionFromPost($this->post->ID);
651
 
652
  //if woocommerce is installed and is a product category
653
+ if (function_exists('is_product_category') && is_product_category()) {
654
  global $wp_query;
655
  $cat = $wp_query->get_queried_object();
656
+ if (!empty($cat)) {
657
+ $description .= $sep . $cat->name;
658
  }
659
+ } else {
660
+ $cat = get_the_terms($this->post->ID, 'category');
661
+ if (!empty($cat)) {
 
662
  $description .= $sep . $cat[0]->name;
663
  }
664
  }
 
665
  }
666
 
667
  if (is_paged()) {
673
  $description .= $this->grabDescriptionFromPost($this->post->ID);
674
 
675
  //if woocommerce is installed and is a product
676
+ if (function_exists('is_product') && is_product()) {
677
+ $cat = get_the_terms($this->post->ID, 'product_cat');
678
+ if (!empty($cat) && count($cat) > 1) {
679
  $description .= $sep . $cat[0]->name;
680
  }
681
  }
 
682
  }
683
  }
684
  }
823
  $favicon = get_bloginfo('wpurl') . '/touch-icon' . $size . '.png' . $rnd;
824
  $meta .= sprintf("<link rel=\"apple-touch-icon\" sizes=\"" . $size . "x" . $size . "\" href=\"%s\" />" . "\n", $favicon);
825
  }
826
+ } else {
827
  if (file_exists(ABSPATH . 'favicon.ico')) {
828
  $meta .= sprintf("<link rel=\"shortcut icon\" href=\"%s\" />" . "\n", get_bloginfo('wpurl') . '/favicon.ico');
829
  }
models/SQ_Ico.php CHANGED
@@ -93,19 +93,6 @@ class Model_SQ_Ico {
93
  return true;
94
  }
95
 
96
- // public function save_ico(&$file) {
97
- // $dir = null;
98
- //
99
- // $file = wp_upload_bits($file['name'], null, file_get_contents($file['tmp']));
100
- //
101
- // if (!isset($file['error']) || $file['error'] == '')
102
- // if (isset($file['url']) && $file['url'] <> '') {
103
- // $file['filename'] = basename($file['url']);
104
- // return $file;
105
- // }
106
- // $file = false;
107
- // }
108
-
109
  function remove_ico($file) {
110
  if (file_exists($file)) {
111
  unlink($file);
93
  return true;
94
  }
95
 
 
 
 
 
 
 
 
 
 
 
 
 
 
96
  function remove_ico($file) {
97
  if (file_exists($file)) {
98
  unlink($file);
models/SQ_Post.php CHANGED
@@ -249,6 +249,10 @@ class Model_SQ_Post {
249
  $dir = null;
250
  $file = array();
251
 
 
 
 
 
252
  $response = wp_remote_get($url, array('timeout' => 15));
253
  $file = wp_upload_bits(urlencode(basename($url)), '', wp_remote_retrieve_body($response), $dir);
254
 
249
  $dir = null;
250
  $file = array();
251
 
252
+ if (strpos($url, 'http') === false) {
253
+ $url = 'http:' . $url;
254
+ }
255
+
256
  $response = wp_remote_get($url, array('timeout' => 15));
257
  $file = wp_upload_bits(urlencode(basename($url)), '', wp_remote_retrieve_body($response), $dir);
258
 
models/SQ_Sitemaps.php CHANGED
@@ -61,8 +61,8 @@ class Model_SQ_Sitemaps {
61
 
62
  $xml['image:image'][] = array(
63
  'image:loc' => $image['src'],
64
- 'image:title' => $image['title'],
65
- 'image:caption' => $image['description'],
66
  );
67
  }
68
  }
@@ -109,8 +109,8 @@ class Model_SQ_Sitemaps {
109
 
110
  $xml['image:image'][] = array(
111
  'image:loc' => $image['src'],
112
- 'image:title' => $image['title'],
113
- 'image:caption' => $image['description'],
114
  );
115
  }
116
  }
@@ -129,8 +129,8 @@ class Model_SQ_Sitemaps {
129
  $xml['video:video'][$post->ID] = array(
130
  'video:player_loc' => htmlentities($video),
131
  'video:thumbnail_loc' => htmlentities($images[0]['src']),
132
- 'video:title' => SQ_ObjController::getModel('SQ_Frontend')->grabTitleFromPost($post->ID),
133
- 'video:description' => SQ_ObjController::getModel('SQ_Frontend')->grabDescriptionFromPost($post->ID),
134
  );
135
 
136
  //set the first keyword for this video
@@ -193,8 +193,8 @@ class Model_SQ_Sitemaps {
193
 
194
  $xml['image:image'][] = array(
195
  'image:loc' => $image['src'],
196
- 'image:title' => $image['title'],
197
- 'image:caption' => $image['description'],
198
  );
199
  }
200
  }
@@ -212,8 +212,8 @@ class Model_SQ_Sitemaps {
212
  $xml['video:video'][$post->ID] = array(
213
  'video:player_loc' => $video,
214
  'video:thumbnail_loc' => $images[0]['src'],
215
- 'video:title' => SQ_ObjController::getModel('SQ_Frontend')->grabTitleFromPost($post->ID),
216
- 'video:description' => SQ_ObjController::getModel('SQ_Frontend')->grabDescriptionFromPost($post->ID),
217
  );
218
 
219
  //set the first keyword for this video
61
 
62
  $xml['image:image'][] = array(
63
  'image:loc' => $image['src'],
64
+ 'image:title' => SQ_ObjController::getModel('SQ_Frontend')->clearTitle($image['title']),
65
+ 'image:caption' => SQ_ObjController::getModel('SQ_Frontend')->clearDescription($image['description']),
66
  );
67
  }
68
  }
109
 
110
  $xml['image:image'][] = array(
111
  'image:loc' => $image['src'],
112
+ 'image:title' => SQ_ObjController::getModel('SQ_Frontend')->clearTitle($image['title']),
113
+ 'image:caption' => SQ_ObjController::getModel('SQ_Frontend')->clearDescription($image['description']),
114
  );
115
  }
116
  }
129
  $xml['video:video'][$post->ID] = array(
130
  'video:player_loc' => htmlentities($video),
131
  'video:thumbnail_loc' => htmlentities($images[0]['src']),
132
+ 'video:title' => SQ_ObjController::getModel('SQ_Frontend')->clearTitle(SQ_ObjController::getModel('SQ_Frontend')->grabTitleFromPost($post->ID)),
133
+ 'video:description' => SQ_ObjController::getModel('SQ_Frontend')->clearDescription(SQ_ObjController::getModel('SQ_Frontend')->grabDescriptionFromPost($post->ID)),
134
  );
135
 
136
  //set the first keyword for this video
193
 
194
  $xml['image:image'][] = array(
195
  'image:loc' => $image['src'],
196
+ 'image:title' => SQ_ObjController::getModel('SQ_Frontend')->clearTitle($image['title']),
197
+ 'image:caption' => SQ_ObjController::getModel('SQ_Frontend')->clearDescription($image['description']),
198
  );
199
  }
200
  }
212
  $xml['video:video'][$post->ID] = array(
213
  'video:player_loc' => $video,
214
  'video:thumbnail_loc' => $images[0]['src'],
215
+ 'video:title' => SQ_ObjController::getModel('SQ_Frontend')->clearTitle(SQ_ObjController::getModel('SQ_Frontend')->grabTitleFromPost($post->ID)),
216
+ 'video:description' => SQ_ObjController::getModel('SQ_Frontend')->clearDescription(SQ_ObjController::getModel('SQ_Frontend')->grabDescriptionFromPost($post->ID)),
217
  );
218
 
219
  //set the first keyword for this video
readme.txt CHANGED
@@ -1,8 +1,8 @@
1
  === SEO by SQUIRRLY ===
2
  Contributors: cifi, calinvingan, florinmuresan
3
- Tags: seo,seo optimization,seo content,seo plugin,wordpress seo,plugin,content seo,search engine optimization,xml,sitemap,keyword,keyword research,post,posts,page,squirrly,tag,image,images,photos,flickr,statistics,stats,google,content,title,description,favicon,mobile,canonical,author,google plus,analytics,admin,seo correction,seo title,seo meta,meta,google,twitter,news,blog,e-commerce,ecommerce,woocommerce,feed,feeds,marketing,multisite,buddypress,social,social media,url,automatic,iphone
4
  Requires at least: 3.5
5
- Tested up to: 4.2.1
6
  Stable tag: trunk
7
  Donate link: https://www.squirrly.co/wordpress-seo-by-squirrly
8
 
@@ -135,6 +135,24 @@ Type a keyword to the right of the screen and start using Squirrly Seo. Enjoy!
135
 
136
 
137
  == Changelog ==
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
138
 
139
  = 5.0.1 =
140
  * Fixed some issues for the PHP 5.1-5.2
@@ -303,7 +321,7 @@ Andreea Leau - VP Marketing
303
  Cristina Leau - Squirrly mascot designer
304
  Alexandra Nicola - Content Writer, future COO
305
  Teodora Vingan - SEO Analyser
306
- Ana Darstaru - Content Writer
307
  Teo - SEO Consultant
308
 
309
  Investors:
@@ -426,4 +444,4 @@ It all depends on how you have setup your wordpress until now. Some people use S
426
  == Upgrade Notice ==
427
 
428
  = 5.0.0 =
429
- 5.0.0 is an important update. Different Squirrly look. Compatible with eCommerce plugins. Added interactive learning features. Added robots.txt and sitemap.xml for multisites. Added the JSON-LD. Option to show Squirrly for selected Post Types and more.
1
  === SEO by SQUIRRLY ===
2
  Contributors: cifi, calinvingan, florinmuresan
3
+ Tags: seo,seo plugin,wordpress seo,seo optimization,seo content,plugin,content seo,search engine optimization,xml,sitemap,keyword,keyword research,post,posts,page,multisite,squirrly,wordpress,tag,image,images,photos,flickr,statistics,stats,google,content,title,description,favicon,mobile,canonical,author,google plus,analytics,admin,seo correction,seo title,seo meta,meta,google,twitter,news,blog,e-commerce,ecommerce,woocommerce,feed,feeds,marketing,buddypress,social,social media,url,automatic,iphone
4
  Requires at least: 3.5
5
+ Tested up to: 4.2
6
  Stable tag: trunk
7
  Donate link: https://www.squirrly.co/wordpress-seo-by-squirrly
8
 
135
 
136
 
137
  == Changelog ==
138
+ = 5.1.1 =
139
+ * Fixed the feed style issue
140
+ * Added the custom size image for Open Graph in Squirrly Snippet
141
+ * Increased the plugin loading speed in front-end
142
+ * Improved the communication with the API Server
143
+ * Fixed the post optimization history issue
144
+ * Fixed the encryption for the password and fixed the bad login issue
145
+ * Compatible with WP 4.2.2
146
+
147
+ = 5.0.3 =
148
+ * Prevent canonical, prev, next meta duplicate inserted by other SEO plugins
149
+ * Fixed snippet custom title and description to change when other SEO plugins are installed
150
+ * Fixed javascript issue in login page
151
+
152
+ = 5.0.2 =
153
+ * Made it download the remote images while in text editor
154
+ * Detects remote images when the URL doesn't contain http
155
+ * Fixed favicon disappear on plugin updates
156
 
157
  = 5.0.1 =
158
  * Fixed some issues for the PHP 5.1-5.2
321
  Cristina Leau - Squirrly mascot designer
322
  Alexandra Nicola - Content Writer, future COO
323
  Teodora Vingan - SEO Analyser
324
+ Ana Darstaru - Chief of Customer Service
325
  Teo - SEO Consultant
326
 
327
  Investors:
444
  == Upgrade Notice ==
445
 
446
  = 5.0.0 =
447
+ 5.1.0 is an important update. Different Squirrly look. Compatible with eCommerce plugins. Added interactive learning features. Added robots.txt and sitemap.xml for multisites. Added the JSON-LD. Option to show Squirrly for selected Post Types and more.
squirrly.php CHANGED
@@ -8,12 +8,12 @@
8
  Plugin URI: http://www.squirrly.co
9
  Description: SEO Plugin By Squirrly is for the NON-SEO experts. Get Excellent Seo with Better Content, Ranking and Analytics. For Both Humans and Search Bots.<BR> <a href="http://my.squirrly.co/user" target="_blank"><strong>Check your profile</strong></a>
10
  Author: cifi, calinvingan, florinmuresan
11
- Version: 5.0.1
12
  Author URI: http://www.squirrly.co
13
  */
14
 
15
  /* SET THE CURRENT VERSION ABOVE AND BELOW */
16
- define('SQ_VERSION', '5.0.1');
17
  /* Call config files */
18
  if (file_exists(dirname(__FILE__) . '/config/config.php')) {
19
  require(dirname(__FILE__) . '/config/config.php');
@@ -22,40 +22,39 @@ if (file_exists(dirname(__FILE__) . '/config/config.php')) {
22
  if (PHP_VERSION_ID >= 5100) {
23
  /* inport main classes */
24
  require_once(_SQ_CLASSES_DIR_ . 'SQ_ObjController.php');
25
- require_once(_SQ_CLASSES_DIR_ . 'SQ_BlockController.php');
26
 
27
- /* Main class call */
28
- $fc = SQ_ObjController::getController('SQ_FrontController', false);
29
- $fc->run();
30
-
31
- if (!is_admin()) {
 
 
 
 
 
 
 
 
 
32
  SQ_ObjController::getController('SQ_Frontend');
33
  }
34
-
35
- add_action('sq_processCron', array(SQ_ObjController::getController('SQ_Ranking', false), 'processCron'));
36
  } else {
37
  /* Main class call */
38
- add_action('admin_init', 'phpError');
39
- }
40
-
41
- /**
42
- * Show PHP Error message if PHP is lower the required
43
- */
44
- function phpError() {
45
- add_action('admin_notices', 'showError');
46
  }
 
47
 
48
- /**
49
- * Called in Notice Hook
50
- */
51
- function showError() {
52
- echo '<div class="update-nag"><span style="color:red; font-weight:bold;">' . __('For Squirrly to work, the PHP version has to be equal or greater then 5.1', _SQ_PLUGIN_NAME_) . '</span></div>';
53
- }
54
 
55
- // --
56
- /**
57
- * Upgrade Squirrly call.
58
- */
59
- register_activation_hook(__FILE__, array(SQ_ObjController::getController('SQ_Tools', false), 'sq_activate'));
60
- register_deactivation_hook(__FILE__, array(SQ_ObjController::getController('SQ_Tools', false), 'sq_deactivate'));
61
- }
8
  Plugin URI: http://www.squirrly.co
9
  Description: SEO Plugin By Squirrly is for the NON-SEO experts. Get Excellent Seo with Better Content, Ranking and Analytics. For Both Humans and Search Bots.<BR> <a href="http://my.squirrly.co/user" target="_blank"><strong>Check your profile</strong></a>
10
  Author: cifi, calinvingan, florinmuresan
11
+ Version: 5.1.1
12
  Author URI: http://www.squirrly.co
13
  */
14
 
15
  /* SET THE CURRENT VERSION ABOVE AND BELOW */
16
+ define('SQ_VERSION', '5.1.1');
17
  /* Call config files */
18
  if (file_exists(dirname(__FILE__) . '/config/config.php')) {
19
  require(dirname(__FILE__) . '/config/config.php');
22
  if (PHP_VERSION_ID >= 5100) {
23
  /* inport main classes */
24
  require_once(_SQ_CLASSES_DIR_ . 'SQ_ObjController.php');
 
25
 
26
+ if (is_admin()) {
27
+ require_once(_SQ_CLASSES_DIR_ . 'SQ_BlockController.php');
28
+ SQ_ObjController::getController('SQ_FrontController', false)->run();
29
+ add_action('sq_processCron', array(SQ_ObjController::getController('SQ_Ranking', false), 'processCron'));
30
+ add_action('sq_processPing', array(SQ_ObjController::getController('SQ_Sitemaps'), 'processCron'));
31
+ add_action('sq_processApi', array(SQ_ObjController::getController('SQ_Post'), 'processCron'));
32
+
33
+ /**
34
+ * Upgrade Squirrly call.
35
+ */
36
+ register_activation_hook(__FILE__, array(SQ_ObjController::getController('SQ_Tools', false), 'sq_activate'));
37
+ register_deactivation_hook(__FILE__, array(SQ_ObjController::getController('SQ_Tools', false), 'sq_deactivate'));
38
+ } else {
39
+ SQ_ObjController::getController('SQ_FrontController', false);
40
  SQ_ObjController::getController('SQ_Frontend');
41
  }
 
 
42
  } else {
43
  /* Main class call */
44
+ add_action('admin_init', 'sq_phpError');
 
 
 
 
 
 
 
45
  }
46
+ }
47
 
48
+ /**
49
+ * Show PHP Error message if PHP is lower the required
50
+ */
51
+ function sq_phpError() {
52
+ add_action('admin_notices', 'sq_showError');
53
+ }
54
 
55
+ /**
56
+ * Called in Notice Hook
57
+ */
58
+ function sq_showError() {
59
+ echo '<div class="update-nag"><span style="color:red; font-weight:bold;">' . __('For Squirrly to work, the PHP version has to be equal or greater then 5.1', _SQ_PLUGIN_NAME_) . '</span></div>';
60
+ }
 
themes/default/js/jcache.js DELETED
@@ -1,21 +0,0 @@
1
-
2
- (function(jQuery){this.version='(beta)(0.0.1)';this.maxSize=10;this.keys=new Array();this.cache_length=0;this.items=new Array();this.setItem=function(pKey,pValue)
3
- {if(typeof(pValue)!='undefined')
4
- {if(typeof(this.items[pKey])=='undefined')
5
- {this.cache_length++;}
6
- this.keys.push(pKey);this.items[pKey]=pValue;if(this.cache_length>this.maxSize)
7
- {this.removeOldestItem();}}
8
- return pValue;}
9
- this.removeItem=function(pKey)
10
- {var tmp;if(typeof(this.items[pKey])!='undefined')
11
- {this.cache_length--;var tmp=this.items[pKey];delete this.items[pKey];}
12
- return tmp;}
13
- this.getItem=function(pKey)
14
- {return this.items[pKey];}
15
- this.hasItem=function(pKey)
16
- {return typeof(this.items[pKey])!='undefined';}
17
- this.removeOldestItem=function()
18
- {this.removeItem(this.keys.shift());}
19
- this.clear=function()
20
- {var tmp=this.cache_length;this.keys=new Array();this.cache_length=0;this.items=new Array();return tmp;}
21
- jQuery.jCache=this;return jQuery;})(jQuery);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
themes/default/js/jquery.progressbar.js DELETED
@@ -1,20 +0,0 @@
1
-
2
- (function($){$.extend({progressBar:new function(){this.defaults={steps:2,stepDuration:2,max:10,showText:false,textFormat:'percentage',width:121,height:12,callback:null,boxImage:sq_baseurl+sq_uri+'/js/images/progressbar.gif',barImage:{0:sq_baseurl+sq_uri+'/js/images/progressbg_red.gif',3:sq_baseurl+sq_uri+'/js/images/progressbg_orange.gif',7:sq_baseurl+sq_uri+'/js/images/progressbg_green.gif'},running_value:0,value:0,image:null};this.construct=function(arg1,arg2){var argvalue=null;var argconfig=null;if(arg1!=null){if(!isNaN(arg1)){argvalue=arg1;if(arg2!=null){argconfig=arg2;}}else{argconfig=arg1;}}
3
- return this.each(function(child){var pb=this;var config=this.config;if(argvalue!=null&&this.bar!=null&&this.config!=null){this.config.value=parseInt(argvalue)
4
- if(argconfig!=null)
5
- pb.config=$.extend(this.config,argconfig);config=pb.config;}else{var $this=$(this);var config=$.extend({},$.progressBar.defaults,argconfig);config.id=$this.attr('id')?$this.attr('id'):Math.ceil(Math.random()*100000);if(argvalue==null)
6
- argvalue=$this.html().replace("%","")
7
- config.value=parseInt(argvalue);config.running_value=0;config.image=getBarImage(config);var numeric=['steps','stepDuration','max','width','height','running_value','value'];for(var i=0;i<numeric.length;i++)
8
- config[numeric[i]]=parseInt(config[numeric[i]]);$this.html("");var bar=document.createElement('img');var text=document.createElement('span');var $bar=$(bar);var $text=$(text);pb.bar=$bar;$bar.attr('id',config.id+"_pbImage");$text.attr('id',config.id+"_pbText");$text.html(getText(config));$bar.attr('title',getText(config));$bar.attr('alt',getText(config));$bar.attr('src',config.boxImage);$bar.attr('width',config.width);$bar.css("width",config.width+"px");$bar.css("height",config.height+"px");$bar.css("background-image","url("+config.image+")");$bar.css("background-position",((config.width*-1))+'px 50%');$bar.css("padding","0");$bar.css("margin","0");$this.append($bar);$this.append($text);}
9
- function getPercentage(config){return config.running_value*100/config.max;}
10
- function getBarImage(config){var image=config.barImage;if(typeof(config.barImage)=='object'){for(var i in config.barImage){if(config.running_value>=parseInt(i)){image=config.barImage[i];}else{break;}}}
11
- return image;}
12
- function getText(config){if(config.showText){if(config.textFormat=='percentage'){return" "+Math.round(config.running_value)+"%";}else if(config.textFormat=='fraction'){return" "+config.running_value+'/'+config.max;}}}
13
- config.increment=Math.round((config.value-config.running_value)/config.steps);if(config.increment<0)
14
- config.increment*=-1;if(config.increment<1)
15
- config.increment=1;var t=setInterval(function(){var pixels=config.width/100;if(config.running_value>config.value){if(config.running_value-config.increment<config.value){config.running_value=config.value;}else{config.running_value-=config.increment;}}
16
- else if(config.running_value<config.value){if(config.running_value+config.increment>config.value){config.running_value=config.value;}else{config.running_value+=config.increment;}}
17
- if(config.running_value==config.value)
18
- clearInterval(t);var $bar=$("#"+config.id+"_pbImage");var $text=$("#"+config.id+"_pbText");var image=getBarImage(config);if(image!=config.image){$bar.css("background-image","url("+image+")");config.image=image;}
19
- $bar.css("background-position",(((config.width*-1))+(getPercentage(config)*pixels))+'px 50%');$bar.attr('title',getText(config));$text.html(getText(config));if(config.callback!=null&&typeof(config.callback)=='function')
20
- config.callback(config);pb.config=config;},config.stepDuration);});};}});$.fn.extend({progressBar:$.progressBar.construct});})(jQuery);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
themes/default/js/sq_blockdashboard.js CHANGED
@@ -1,4 +1,12 @@
1
- jQuery(document).ready(function () {
 
 
 
 
 
 
 
 
2
  if (jQuery('#sq_settings_login').length > 0) {
3
  jQuery('#sq_settings_login').after(jQuery('.sq_helpcontent'));
4
  }
@@ -23,4 +31,4 @@ jQuery(document).ready(function () {
23
  });
24
  });
25
 
26
- });
1
+ if (jQuery('.sq_helpcontent').length > 0) {
2
+ sq_blockdashboard();
3
+ } else {
4
+ jQuery(document).ready(function () {
5
+ sq_blockdashboard();
6
+ });
7
+ }
8
+
9
+ function sq_blockdashboard(){
10
  if (jQuery('#sq_settings_login').length > 0) {
11
  jQuery('#sq_settings_login').after(jQuery('.sq_helpcontent'));
12
  }
31
  });
32
  });
33
 
34
+ };
themes/default/js/sq_blocklogin.js CHANGED
@@ -5,7 +5,7 @@ if (jQuery('#sq_blocklogin').length > 0) {
5
  sq_blocklogin();
6
  });
7
  }
8
- var sq_blocklogin = function () {
9
  jQuery('#sq_email').bind('keypress', function (event) {
10
 
11
  if (event.keyCode === 13)
@@ -116,7 +116,7 @@ var sq_blocklogin = function () {
116
  });
117
  }
118
 
119
- var sq_autoLogin = function () {
120
  if (!checkEmail(jQuery('#sq_email').val())) {
121
  jQuery('#sq_blocklogin').find('.sq_error').html(__invalid_email);
122
  jQuery('#sq_register_email').show();
@@ -196,7 +196,7 @@ var sq_autoLogin = function () {
196
  });
197
  }
198
 
199
- var sq_reload = function (response) {
200
  if (typeof response.success !== 'undefined') {
201
  jQuery('#sq_login_success').html(response.success);
202
  }
@@ -217,7 +217,7 @@ var sq_reload = function (response) {
217
  }
218
  }
219
 
220
- var checkEmail = function (email) {
221
  var emailRegEx = /^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}$/i;
222
 
223
  if (email !== '')
5
  sq_blocklogin();
6
  });
7
  }
8
+ function sq_blocklogin() {
9
  jQuery('#sq_email').bind('keypress', function (event) {
10
 
11
  if (event.keyCode === 13)
116
  });
117
  }
118
 
119
+ function sq_autoLogin() {
120
  if (!checkEmail(jQuery('#sq_email').val())) {
121
  jQuery('#sq_blocklogin').find('.sq_error').html(__invalid_email);
122
  jQuery('#sq_register_email').show();
196
  });
197
  }
198
 
199
+ function sq_reload(response) {
200
  if (typeof response.success !== 'undefined') {
201
  jQuery('#sq_login_success').html(response.success);
202
  }
217
  }
218
  }
219
 
220
+ function checkEmail(email) {
221
  var emailRegEx = /^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}$/i;
222
 
223
  if (email !== '')
themes/default/js/sq_blocksettings.js CHANGED
@@ -6,7 +6,7 @@ if (jQuery('#sq_settings').length > 0) {
6
  });
7
  }
8
 
9
- var sq_blocksettings = function () {
10
  jQuery('#sq_selectall').click(function (event) { //on click
11
  if (this.checked) { // check select status
12
  jQuery('#sq_post_type_option input').each(function () { //loop through each checkbox
@@ -21,7 +21,7 @@ var sq_blocksettings = function () {
21
 
22
  }
23
  //Submit the settings
24
- var sq_submitSettings = function () {
25
 
26
  var sq_post_types = [];
27
  var serialize = jQuery('#sq_settings').find('input[class=sq_post_types]').serializeArray()
6
  });
7
  }
8
 
9
+ function sq_blocksettings() {
10
  jQuery('#sq_selectall').click(function (event) { //on click
11
  if (this.checked) { // check select status
12
  jQuery('#sq_post_type_option input').each(function () { //loop through each checkbox
21
 
22
  }
23
  //Submit the settings
24
+ function sq_submitSettings() {
25
 
26
  var sq_post_types = [];
27
  var serialize = jQuery('#sq_settings').find('input[class=sq_post_types]').serializeArray()
themes/default/js/sq_blocksettingsseo.js CHANGED
@@ -6,7 +6,7 @@ if (jQuery('#sq_settings').length > 0) {
6
  });
7
  }
8
 
9
- var sq_blocksettingsseo = function () {
10
 
11
  ///////////////////////////////
12
  var snippet_timeout;
@@ -234,7 +234,7 @@ var sq_blocksettingsseo = function () {
234
  }
235
 
236
  //Submit the settings
237
- var sq_submitSettings = function () {
238
  var sq_sitemap = [];
239
  var serialize = jQuery('#sq_settings').find('input[class=sq_sitemap]').serializeArray()
240
  jQuery(serialize).each(function () {
6
  });
7
  }
8
 
9
+ function sq_blocksettingsseo() {
10
 
11
  ///////////////////////////////
12
  var snippet_timeout;
234
  }
235
 
236
  //Submit the settings
237
+ function sq_submitSettings() {
238
  var sq_sitemap = [];
239
  var serialize = jQuery('#sq_settings').find('input[class=sq_sitemap]').serializeArray()
240
  jQuery(serialize).each(function () {
themes/default/js/sq_blocksupport.js CHANGED
@@ -6,7 +6,7 @@ if (jQuery('#sq_options').length > 0) {
6
  });
7
  }
8
 
9
- var sq_blocksupport = function () {
10
  if (typeof sq_facebook_b === 'undefined')
11
  var sq_facebook_b = '<iframe src="//www.facebook.com/plugins/like.php?href=https%3A%2F%2Fwww.facebook.com%2FSquirrly.co&amp;send=false&amp;layout=button_count&amp;width=90&amp;show_faces=false&amp;font=arial&amp;colorscheme=light&amp;action=like&amp;height=21&amp;appId=384403641631593" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:90px; height:21px;" allowTransparency="true"></iframe>';
12
 
6
  });
7
  }
8
 
9
+ function sq_blocksupport() {
10
  if (typeof sq_facebook_b === 'undefined')
11
  var sq_facebook_b = '<iframe src="//www.facebook.com/plugins/like.php?href=https%3A%2F%2Fwww.facebook.com%2FSquirrly.co&amp;send=false&amp;layout=button_count&amp;width=90&amp;show_faces=false&amp;font=arial&amp;colorscheme=light&amp;action=like&amp;height=21&amp;appId=384403641631593" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:90px; height:21px;" allowTransparency="true"></iframe>';
12
 
themes/default/js/sq_menu.js CHANGED
@@ -1,4 +1,12 @@
1
- var ctl_setThemeColors = function (background, button, text) {
 
 
 
 
 
 
 
 
2
  jQuery('#sq_settings legend').css('background-color', background);
3
  jQuery('#sq_settings input[type="submit"]').css('background-color', button);
4
  jQuery('#sq_settings input[type="submit"]').css('color', text);
@@ -8,15 +16,7 @@ var ctl_setThemeColors = function (background, button, text) {
8
 
9
  }
10
 
11
- if (jQuery('#sq_settings').length > 0) {
12
- sq_blockmenu();
13
- } else {
14
- jQuery(document).ready(function () {
15
- sq_blockmenu();
16
- });
17
- }
18
-
19
- var sq_blockmenu = function () {
20
  ///////////////////////////////
21
 
22
  //Go to dashboard listener
@@ -71,7 +71,7 @@ var sq_blockmenu = function () {
71
  }
72
 
73
  //Show the title length in post editor
74
- var sq_trackLength = function (field, type) {
75
  var min = 0;
76
  var max = 0;
77
  if (typeof field === 'undefined')
@@ -97,7 +97,7 @@ var sq_trackLength = function (field, type) {
97
  }
98
 
99
  //get the snippet in settings and post editor
100
- var sq_getSnippet = function (url, show_url) {
101
  if (jQuery('#sq_snippet').length == 0) {
102
  return;
103
  }
@@ -154,7 +154,7 @@ var sq_getSnippet = function (url, show_url) {
154
  }
155
 
156
  //Show user status in Squirrly > Account info
157
- var sq_getUserStatus = function () {
158
  jQuery('#sq_userinfo').addClass('sq_loading');
159
  jQuery('#sq_userstatus').addClass('sq_loading');
160
 
@@ -199,7 +199,7 @@ var sq_getUserStatus = function () {
199
  }
200
 
201
  //Recheck the user rank in Squirrly > Performance analytics
202
- var sq_recheckRank = function (post_id) {
203
  jQuery('.sq_rank_column_button_recheck').hide();
204
  jQuery('#sq_rank_value' + post_id).html('').addClass('sq_loading');
205
  jQuery.getJSON(
@@ -227,7 +227,7 @@ var sq_recheckRank = function (post_id) {
227
  }
228
 
229
  //Show user status in Squirrly > Account info
230
- var sq_getSlides = function (category) {
231
  if (jQuery('#sq_help' + category + 'slides').length == 0) {
232
  return;
233
  }
@@ -246,7 +246,7 @@ var sq_getSlides = function (category) {
246
  });
247
  }
248
 
249
- var sq_getHelp = function (category, zone) {
250
  var loadingAjax = true;
251
 
252
  if (zone == 'content' && jQuery('#sq_help' + category + zone).length == 0) {
@@ -311,7 +311,7 @@ var sq_getHelp = function (category, zone) {
311
  }, 10000);
312
 
313
  }
314
- var checkResponse = function (response) {
315
  if (typeof response.error !== 'undefined') {
316
  if (response.error === 'invalid_token') {
317
  jQuery.getJSON(
@@ -328,7 +328,7 @@ var checkResponse = function (response) {
328
  }
329
  }
330
 
331
- var showSaved = function (time) {
332
  jQuery("#sq_settings").prepend('<div class="sq_savenotice sq_absolute" ><span class="sq_success">Saved!</span></div>');
333
 
334
  if (typeof sq_help_reload == 'function') {
1
+ if (jQuery('#sq_settings').length > 0) {
2
+ sq_blockmenu();
3
+ } else {
4
+ jQuery(document).ready(function () {
5
+ sq_blockmenu();
6
+ });
7
+ }
8
+
9
+ function ctl_setThemeColors(background, button, text) {
10
  jQuery('#sq_settings legend').css('background-color', background);
11
  jQuery('#sq_settings input[type="submit"]').css('background-color', button);
12
  jQuery('#sq_settings input[type="submit"]').css('color', text);
16
 
17
  }
18
 
19
+ function sq_blockmenu() {
 
 
 
 
 
 
 
 
20
  ///////////////////////////////
21
 
22
  //Go to dashboard listener
71
  }
72
 
73
  //Show the title length in post editor
74
+ function sq_trackLength(field, type) {
75
  var min = 0;
76
  var max = 0;
77
  if (typeof field === 'undefined')
97
  }
98
 
99
  //get the snippet in settings and post editor
100
+ function sq_getSnippet(url, show_url) {
101
  if (jQuery('#sq_snippet').length == 0) {
102
  return;
103
  }
154
  }
155
 
156
  //Show user status in Squirrly > Account info
157
+ function sq_getUserStatus() {
158
  jQuery('#sq_userinfo').addClass('sq_loading');
159
  jQuery('#sq_userstatus').addClass('sq_loading');
160
 
199
  }
200
 
201
  //Recheck the user rank in Squirrly > Performance analytics
202
+ function sq_recheckRank(post_id) {
203
  jQuery('.sq_rank_column_button_recheck').hide();
204
  jQuery('#sq_rank_value' + post_id).html('').addClass('sq_loading');
205
  jQuery.getJSON(
227
  }
228
 
229
  //Show user status in Squirrly > Account info
230
+ function sq_getSlides(category) {
231
  if (jQuery('#sq_help' + category + 'slides').length == 0) {
232
  return;
233
  }
246
  });
247
  }
248
 
249
+ function sq_getHelp(category, zone) {
250
  var loadingAjax = true;
251
 
252
  if (zone == 'content' && jQuery('#sq_help' + category + zone).length == 0) {
311
  }, 10000);
312
 
313
  }
314
+ function checkResponse(response) {
315
  if (typeof response.error !== 'undefined') {
316
  if (response.error === 'invalid_token') {
317
  jQuery.getJSON(
328
  }
329
  }
330
 
331
+ function showSaved(time) {
332
  jQuery("#sq_settings").prepend('<div class="sq_savenotice sq_absolute" ><span class="sq_success">Saved!</span></div>');
333
 
334
  if (typeof sq_help_reload == 'function') {
themes/default/js/sq_rank.js DELETED
@@ -1,33 +0,0 @@
1
-
2
- (function(){var SQ=this;if(typeof this.sq_dashurl=='undefined')
3
- if(typeof sq_dashurl!=='undefined')
4
- this.sq_dashurl=sq_dashurl;else
5
- this.sq_dashurl='https://my.squirrly.co/';if(typeof this.__token=='undefined'&&typeof __token!=='undefined')
6
- this.__token=__token;if(typeof this.typenow=='undefined'&&typeof typenow!=='undefined')
7
- this.typenow=typenow;this.inArray=function(id,array){if(array.length==0)
8
- return false;for(var i=0;i<array.length;i++){if(array[i]==id){return true;}}
9
- return false;};this.getHashParam=function(key){if(location.href.indexOf("#")!=-1&&window.location.href.split('#')[1]!=''){var results=new RegExp('[\\?&#]'+key+'=([^&#]*)').exec(window.location.href);if(results)
10
- return results[1]||0;}
11
- return false;};this.setHashParam=function(key,val){var separator='';if(!this.getHashParam(key)){if(location.href.indexOf("#")!=-1){if(location.href.split('#')[1]!='')
12
- separator='&';}else{separator='#';}
13
- window.location.href=window.location.href+separator+key+'='+val;}else{window.location.href=window.location.href.replace(key+'='+this.getHashParam(key),key+'='+val);}
14
- return false;};this.sq_rank={getRanks:function(posts){jQuery.getJSON(sqQuery.ajaxurl,{action:'sq_posts_rank',posts:posts,nonce:sqQuery.nonce}).success(function(response){if(response)
15
- if(typeof response.error!=='undefined'){if(response.error=='subscription_expired')
16
- jQuery('.sq_rank_column_row').each(function(){jQuery(this).removeClass('sq_minloading').html('<span class="sq_rank"><span class="sq_expired">For Squirrly Rank<br /><a href="'+SQ.sq_dashurl+'login/?token='+SQ.__token+'&redirect_to='+escape(SQ.sq_dashurl+'user/plans')+'" target="_blank">upgrade your plan</a></span></span>');});}else{if(typeof response.global!=='undefined'){jQuery('.wrap').before(response.global);}
17
- if(typeof response.status!=='undefined'){jQuery('.wrap').before(response.status);jQuery('.sq_status_close').bind('click',function(){jQuery('#sq_status').remove();jQuery.getJSON(sqQuery.ajaxurl,{action:'sq_posts_status_close',nonce:sqQuery.nonce});});}
18
- var post_id;jQuery('.sq_rank_column_row').each(function(){jQuery(this).removeClass('sq_minloading');if(jQuery.inArray(jQuery(this).attr('ref'),posts)!==-1){post_id=jQuery(this).attr('ref');jQuery(this).removeClass('sq_minloading').html('<span class="sq_rank" ref="'+post_id+'"></span>');response.posts[jQuery(this).attr('ref')].offpage=((response.posts[post_id].offpage>0)?'+':'')+response.posts[post_id].offpage;if(response.posts[post_id].onpage>0){jQuery(this).find('.sq_rank').append('<span class="sq_rank_column_button sq_show_more" ref="'+post_id+'">'+__sq_rankseemore_text+'</span>');SQ.sq_eventsrank.addClick(jQuery(this).find('.sq_show_more'));}else{jQuery(this).find('.sq_rank').append('<span class="sq_rank_column_button sq_optimize" ref="'+post_id+'">'+__sq_optimize_text+'</span>');}}else{jQuery(this).removeClass('sq_minloading').html('<span class="sq_no_rank" ref="'+post_id+'">'+__sq_ranknotpublic_text+'</span>');}});jQuery('.sq_optimize').bind('click',function(){if(typeof sqQuery.adminposturl!=='undefined')
19
- location.href=sqQuery.adminposturl+"?post="+jQuery(this).attr('ref')+"&action=edit";else
20
- location.href="/wp-admin/post.php?post="+jQuery(this).attr('ref')+"&action=edit";});}});jQuery('.sq_rank_column_row').each(function(){});}};this.sq_eventsrank={listen:function(posts){SQ.sq_rank.getRanks(posts);},addClick:function(arrow){arrow.unbind('click').bind('click',function(){var post_id=jQuery(this).attr('ref');SQ.sq_eventsrank.arrowClick(post_id,jQuery(this),true);});if(SQ.getHashParam('sq_brief')!=''){var posts=[];if(SQ.getHashParam('sq_brief').indexOf(",")!=-1){posts=SQ.getHashParam('sq_brief').split(",");}else{posts[0]=SQ.getHashParam('sq_brief');}
21
- for(var i=0;i<posts.length;i++){jQuery('.sq_rank_column_row[ref='+posts[0]+']').find('.sq_show_more').trigger('click');}}},arrowClick:function(post_id,_this,scroll){SQ.sq_eventsrank.loadBrief(post_id);if(jQuery('#sq_post-'+post_id).is(":visible")){jQuery('#sq_post-'+post_id).hide();if(jQuery('#sq_post-'+post_id).length!=0)
22
- jQuery('#sq_post_details-'+post_id).hide();if(typeof _this!=='undefined'){_this.find('.sq_arrow_down').removeClass('sq_arrow_up');_this.find('.sq_more_detail_text').html(__sq_more_details);}}else{jQuery('#sq_post-'+post_id).show();if(typeof _this!=='undefined'){_this.find('.sq_arrow_down').addClass('sq_arrow_up');_this.find('.sq_more_detail_text').html(__sq_less_details);if(scroll)
23
- var rowtop=jQuery('#sq_post-'+post_id).find('.sq_post_rank_content').offset().top-200;var scrolltop=jQuery(window).scrollTop();if(scrolltop<rowtop){jQuery('html,body').animate({scrollTop:rowtop},1000,function(){});}}}
24
- if(typeof _this!=='undefined'){jQuery('#sq_post-'+post_id).find('.sq_post_rank_close').unbind('click').bind('click',function(){_this.trigger('click');});}
25
- jQuery('#sq_post-'+post_id).find('.sq_post_rank_refresh').unbind('click').bind('click',function(){SQ.sq_eventsrank.loadBrief(post_id);});},loadBrief:function(post_id){if(jQuery('#sq_post-'+post_id).length==0){jQuery('#post-'+post_id).after('<tr id="sq_post-'+post_id+'" style="display:none"><td colspan="'+(jQuery('#post-'+post_id+' td').length+1)+'" class="sq_post_rank_row"><div class="sq_post_rank_title">'+__sq_article_rank+'</div><div class="sq_post_rank_content sq_loading"></div><div class="sq_post_arrow_details"></div><div class="sq_post_rank_close">x</div><div class="sq_post_rank_refresh">'+__sq_refresh+'</div></td></tr>');}else{jQuery('#sq_post-'+post_id).find('.sq_post_rank_content').html('');jQuery('#sq_post-'+post_id).find('.sq_post_arrow_details').html('');jQuery('#sq_post_details-'+post_id).hide();jQuery('#sq_post-'+post_id).find('.sq_post_rank_content').addClass('sq_loading');}
26
- jQuery.getJSON(sqQuery.ajaxurl,{action:'sq_post_rank_brief',post:post_id,nonce:sqQuery.nonce}).success(function(response){jQuery('#sq_post-'+post_id).find('.sq_post_rank_content').removeClass('sq_loading');jQuery('#sq_rank_default_text').remove();if(response)
27
- if(typeof response.error!=='undefined'){jQuery('#sq_post-'+post_id).find('.sq_post_rank_content').html('<ul class="sq_no_information"><li>'+response.message+'</li></ul>');}else{jQuery('#sq_post-'+post_id).find('.sq_post_arrow_details').html('<span class="sq_arrow_button"><span class="sq_more_detail_text">'+__sq_more_details+'</span><span class="sq_arrow_down"></span></span>');jQuery('#sq_post-'+post_id).find('.sq_post_rank_content').html(response);jQuery('#sq_post-'+post_id).find('.sq_post_arrow_details').prepend('<div class="sq_report_interval">'+__sq_interval_text+'<select id="sq_interval-'+post_id+'"><option value="day">'+__sq_interval_day+'</option><option value="week">'+__sq_interval_week+'</option><option value="month" selected="selected" >'+__sq_interval_month+'</option></select></div>');jQuery('#sq_interval-'+post_id).bind('change',function(){jQuery('#sq_post_details-'+post_id).hide();jQuery('#sq_post-'+post_id).find('.sq_arrow_button').trigger('click');});jQuery('#sq_post-'+post_id).find('.sq_rank_history_text').bind('click',function(){if(jQuery(this).attr('ref')!=''){jQuery('#sq_post_details-'+post_id).hide();jQuery('#sq_interval-'+post_id+' option[value='+jQuery(this).attr('ref')+']').attr("selected","selected");jQuery('#sq_post-'+post_id).find('.sq_arrow_button').trigger('click');}});SQ.sq_eventsrank.detailsClick(jQuery('#sq_post-'+post_id).find('.sq_arrow_button'),post_id);jQuery('#sq_post-'+post_id).find('.sq_post_arrow_details').append('<span class="sq_allposts_button" style="display:none"><span class="sq_allposts_text">'+__sq_goto_allposts+'</span></span>');jQuery('#sq_post-'+post_id).find('.sq_allposts_button').bind('click',function(){if(typeof sqQuery.adminlisturl!=='undefined')
28
- location.href=sqQuery.adminlisturl+"?post_type="+SQ.typenow+"&post_status=publish&sq_post_id="+post_id+"#sq_brief="+post_id;else
29
- location.href="/wp-admin/edit.php?post_type="+SQ.typenow+"&post_status=publish&sq_post_id="+post_id+"#sq_brief="+post_id;});var originalFontSize=12;jQuery('.sq_rank_total_value').each(function(){var spanHeight=jQuery(this).outerHeight();var sectionHeight=50;var ratio=(sectionHeight/spanHeight);if(ratio<1)
30
- ratio=ratio/1.10;var newFontSize=ratio*originalFontSize;jQuery(this).css({"font-size":newFontSize});});}});},loadDetails:function(post_id){var sq_interval='month';if(jQuery('#sq_post_details-'+post_id).length==0){jQuery('#sq_post-'+post_id).after('<tr id="sq_post_details-'+post_id+'" style="display:none"><td colspan="'+(jQuery('#post-'+post_id+' td').length+1)+'" class="sq_post_rank_row"><div class="sq_post_rank_content sq_loading"></div></td></tr>');}else{jQuery('#sq_post_details-'+post_id).find('.sq_post_rank_content').html('');jQuery('#sq_post_details-'+post_id).find('.sq_post_rank_content').addClass('sq_loading');}
31
- if(jQuery('#sq_interval-'+post_id).length!=0&&jQuery('#sq_interval-'+post_id+' :selected').val()!='')
32
- sq_interval=jQuery('#sq_interval-'+post_id+' :selected').val();jQuery.getJSON(sqQuery.ajaxurl,{action:'sq_post_rank',post:post_id,interval:sq_interval,nonce:sqQuery.nonce}).success(function(response){jQuery('#sq_post_details-'+post_id).find('.sq_post_rank_content').removeClass('sq_loading');jQuery('#sq_post_details-'+post_id).find('.sq_post_rank_content').html(response.rank);});},detailsClick:function(details,post_id){details.unbind('click').bind('click',function(){SQ.sq_eventsrank.loadDetails(post_id);if(jQuery('#sq_post_details-'+post_id).is(":visible")){jQuery('#sq_post_details-'+post_id).hide();jQuery(this).find('.sq_arrow_down').removeClass('sq_arrow_up');jQuery(this).find('.sq_more_detail_text').html(__sq_more_details);}else{jQuery('#sq_post_details-'+post_id).show();jQuery(this).find('.sq_arrow_down').addClass('sq_arrow_up');jQuery(this).find('.sq_more_detail_text').html(__sq_less_details);var rowtop=jQuery(this).offset().top-50;var scrolltop=jQuery(window).scrollTop();if(scrolltop<rowtop){jQuery('html,body').animate({scrollTop:rowtop},1000,function(){});}}});}};})(window);jQuery(document).ready(function(){if(typeof sq_posts!=='undefined')
33
- window.sq_eventsrank.listen(sq_posts);});
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
themes/default/js/xregexp.js DELETED
@@ -1,4 +0,0 @@
1
- ;(function(g){"function"===typeof define?define(g):"object"===typeof exports?(g=g(),("object"===typeof module?module.exports=g:exports).XRegExp=g):XRegExp=g()})(function(){var g,I=function(a,b,c){var d;if(c)if(a.__proto__)a.__proto__=f.prototype;else for(d in f.prototype)a[d]=f.prototype[d];a[j]={captureNames:b};return a},C=function(a){return l.replace.call(a,/([\s\S])(?=[\s\S]*\1)/g,"")},v=function(a,b){if(!f.isRegExp(a))throw new TypeError("Type RegExp expected");var c=l.exec.call(/\/([a-z]*)$/i,String(a))[1],b=b||{};b.add&&(c=C(c+b.add));b.remove&&(c=l.replace.call(c,RegExp("["+b.remove+"]+","g"),""));return a=I(RegExp(a.source,c),a[j]&&a[j].captureNames?a[j].captureNames.slice(0):null,b.addProto)},y=function(a,b){if(Array.prototype.indexOf)return a.indexOf(b);var c=a.length,d;for(d=0;d<c;++d)if(a[d]===b)return d;return-1},D=function(a,b){return J.call(a)==="[object "+b+"]"},K=function(a,b,c){return l.test.call(-1<c.indexOf("x")?/^(?:\s+|#.*|\(\?#[^)]*\))*(?:[?*+]|{\d+(?:,\d*)?})/:/^(?:\(\?#[^)]*\))*(?:[?*+]|{\d+(?:,\d*)?})/,a.slice(b))},L=function(a){a=a||{};D(a,"String")&&(a=f.forEach(a,/[^\s,]+/,function(a){this[a]=!0},{}));return a},N=function(a){if(!/^[\w$]$/.test(a))throw Error("Flag must be a single character A-Za-z0-9_$");M[a]=!0},O=function(a){RegExp.prototype.exec=(a?k:l).exec;RegExp.prototype.test=(a?k:l).test;String.prototype.match=(a?k:l).match;String.prototype.replace=(a?k:l).replace;String.prototype.split=(a?k:l).split;u.natives=a},w=function(a){if(null==a)throw new TypeError("Cannot convert null or undefined to object");return a},j="xregexp",f,u={astral:!1,natives:!1},l={exec:RegExp.prototype.exec,test:RegExp.prototype.test,match:String.prototype.match,replace:String.prototype.replace,split:String.prototype.split},k={},E={},z={},F=[],T={"default":/\\(?:0(?:[0-3][0-7]{0,2}|[4-7][0-7]?)?|[1-9]\d*|x[\dA-Fa-f]{2}|u[\dA-Fa-f]{4}|c[A-Za-z]|[\s\S])|\(\?[:=!]|[?*+]\?|{\d+(?:,\d*)?}\??|[\s\S]/,"class":/\\(?:[0-3][0-7]{0,2}|[4-7][0-7]?|x[\dA-Fa-f]{2}|u[\dA-Fa-f]{4}|c[A-Za-z]|[\s\S])|[\s\S]/},U=/\$(?:{([\w$]+)}|(\d\d?|[\s\S]))/g,V=void 0===l.exec.call(/()??/,"")[1],G=void 0!==RegExp.prototype.sticky,M={g:!0,i:!0,m:!0,y:G},J={}.toString,t;f=function(a,b){var c={hasNamedCapture:!1,captureNames:[]},d="default",e="",n=0,h,i;if(f.isRegExp(a)){if(void 0!==b)throw new TypeError("Cannot supply flags when copying a RegExp");return v(a,{addProto:!0})}a=void 0===a?"":String(a);b=void 0===b?"":String(b);i=a+"/"+b;if(!z[i]){h=a;var g=b,m;if(C(g)!==g)throw new SyntaxError("Invalid duplicate regex flag "+g);h=l.replace.call(h,/^\(\?([\w$]+)\)/,function(a,b){if(l.test.call(/[gy]/,b))throw new SyntaxError("Cannot use flag g or y in mode modifier "+a);g=C(g+b);return""});for(m=0;m<g.length;++m)if(!M[g.charAt(m)])throw new SyntaxError("Unknown regex flag "+g.charAt(m));h={pattern:h,flags:g};a=h.pattern;for(b=h.flags;n<a.length;){do{h=a;m=b;for(var j=n,P=d,q=c,p=F.length,k=null,r=void 0,s=void 0;p--;)if(s=F[p],(s.scope===P||"all"===s.scope)&&(!s.flag||-1<m.indexOf(s.flag)))if(r=f.exec(h,s.regex,j,"sticky")){k={matchLength:r[0].length,output:s.handler.call(q,r,P,m),reparse:s.reparse};break}(h=k)&&h.reparse&&(a=a.slice(0,n)+h.output+a.slice(n+h.matchLength))}while(h&&h.reparse);h?(e+=h.output,n+=h.matchLength||1):(h=f.exec(a,T[d],n,"sticky")[0],e+=h,n+=h.length,"["===h&&"default"===d?d="class":"]"===h&&"class"===d&&(d="default"))}z[i]={pattern:l.replace.call(e,/\(\?:\)(?=\(\?:\))|^\(\?:\)|\(\?:\)$/g,""),flags:l.replace.call(b,/[^gimy]+/g,""),captures:c.hasNamedCapture?c.captureNames:null}}i=z[i];return I(RegExp(i.pattern,i.flags),i.captures,!0)};f.prototype=RegExp();f.version="3.0.0-pre";f.addToken=function(a,b,c){var c=c||{},d=c.optionalFlags,e;c.flag&&N(c.flag);if(d){d=l.split.call(d,"");for(e=0;e<d.length;++e)N(d[e])}F.push({regex:v(a,{add:"g"+(G?"y":"")}),handler:b,scope:c.scope||"default",flag:c.flag,reparse:c.reparse});f.cache.flush("patterns")};f.cache=function(a,b){var c=a+"/"+(b||"");return E[c]||(E[c]=f(a,b))};f.cache.flush=function(a){"patterns"===a?z={}:E={}};f.escape=function(a){return l.replace.call(w(a),/[-[\]{}()*+?.,\\^$|#\s]/g,"\\$&")};f.exec=function(a,b,c,d){var e="g";if(G&&(d||b.sticky&&!1!==d))e+="y";b[j]=b[j]||{captureNames:null};e=b[j][e]||(b[j][e]=v(b,{add:e,remove:!1===d?"y":""}));e.lastIndex=c=c||0;a=k.exec.call(e,a);d&&(a&&a.index!==c)&&(a=null);b.global&&(b.lastIndex=a?e.lastIndex:0);return a};f.forEach=function(a,b,c,d){for(var e=0,n=-1;e=f.exec(a,b,e);)c.call(d,e,++n,a,b),e=e.index+(e[0].length||1);return d};f.globalize=function(a){return v(a,{add:"g",addProto:!0})};f.install=function(a){a=L(a);!u.astral&&a.astral&&(f.cache.flush("patterns"),u.astral=!0);!u.natives&&a.natives&&O(!0)};f.isInstalled=function(a){return!!u[a]};f.isRegExp=function(a){return"[object RegExp]"===J.call(a)};f.match=function(a,b,c){var d=b.global&&"one"!==c||"all"===c,e=(d?"g":"")+(b.sticky?"y":"");b[j]=b[j]||{captureNames:null};e=b[j][e||"noGY"]||(b[j][e||"noGY"]=v(b,{add:e,remove:"one"===c?"g":""}));a=l.match.call(w(a),e);b.global&&(b.lastIndex="one"===c&&a?a.index+a[0].length:0);return d?a||[]:a&&a[0]};f.matchChain=function(a,b){return function d(a,n){var h=b[n].regex?b[n]:{regex:b[n]},i=[],g=function(a){if(h.backref){if(!(a.hasOwnProperty(h.backref)||+h.backref<a.length))throw new ReferenceError("Backreference to undefined group: "+h.backref);i.push(a[h.backref]||"")}else i.push(a[0])},m;for(m=0;m<a.length;++m)f.forEach(a[m],h.regex,g);return n===b.length-1||!i.length?i:d(i,n+1)}([a],0)};f.replace=function(a,b,c,d){var e=f.isRegExp(b),n=b.global&&"one"!==d||"all"===d,h=(n?"g":"")+(b.sticky?"y":""),i=b;e?(b[j]=b[j]||{captureNames:null},i=b[j][h||"noGY"]||(b[j][h||"noGY"]=v(b,{add:h,remove:"one"===d?"g":""}))):n&&(i=RegExp(f.escape(String(b)),"g"));a=k.replace.call(w(a),i,c);e&&b.global&&(b.lastIndex=0);return a};f.replaceEach=function(a,b){var c,d;for(c=0;c<b.length;++c)d=b[c],a=f.replace(a,d[0],d[1],d[2]);return a};f.split=function(a,b,c){return k.split.call(w(a),b,c)};f.test=function(a,b,c,d){return!!f.exec(a,b,c,d)};f.uninstall=function(a){a=L(a);u.astral&&a.astral&&(f.cache.flush("patterns"),u.astral=!1);u.natives&&a.natives&&O(!1)};f.union=function(a,b){var c=/(\()(?!\?)|\\([1-9]\d*)|\\[\s\S]|\[(?:[^\\\]]|\\[\s\S])*]/g,d=[],e=0,n,h,i,g=function(a,b,c){var d=h[e-n];if(b){if(++e,d)return"(?<"+d+">"}else if(c)return"\\"+(+c+n);return a},m;if(!D(a,"Array")||!a.length)throw new TypeError("Must provide a nonempty array of patterns to merge");for(m=0;m<a.length;++m)i=a[m],f.isRegExp(i)?(n=e,h=i[j]&&i[j].captureNames||[],d.push(l.replace.call(f(i.source).source,c,g))):d.push(f.escape(i));return f(d.join("|"),b)};k.exec=function(a){var b=this.lastIndex,c=l.exec.apply(this,arguments),d,e;if(c){!V&&(1<c.length&&-1<y(c,""))&&(d=v(this,{remove:"g"}),l.replace.call(String(a).slice(c.index),d,function(){var a=arguments.length,b;for(b=1;b<a-2;++b)void 0===arguments[b]&&(c[b]=void 0)}));if(this[j]&&this[j].captureNames)for(e=1;e<c.length;++e)(d=this[j].captureNames[e-1])&&(c[d]=c[e]);this.global&&(!c[0].length&&this.lastIndex>c.index)&&(this.lastIndex=c.index)}this.global||(this.lastIndex=b);return c};k.test=function(a){return!!k.exec.call(this,a)};k.match=function(a){var b;if(f.isRegExp(a)){if(a.global)return b=l.match.apply(this,arguments),a.lastIndex=0,b}else a=RegExp(a);return k.exec.call(a,w(this))};k.replace=function(a,b){var c=f.isRegExp(a),d,e,g;c?(a[j]&&(e=a[j].captureNames),d=a.lastIndex):a+="";g=D(b,"Function")?l.replace.call(String(this),a,function(){var d=arguments,i;if(e){d[0]=new String(d[0]);for(i=0;i<e.length;++i)e[i]&&(d[0][e[i]]=d[i+1])}if(c&&a.global)a.lastIndex=d[d.length-2]+d[0].length;return b.apply(void 0,d)}):l.replace.call(null==this?this:String(this),a,function(){var a=arguments;return l.replace.call(String(b),U,function(b,c,d){if(c){d=+c;if(d<=a.length-3)return a[d]||"";d=e?y(e,c):-1;if(d<0)throw new SyntaxError("Backreference to undefined group "+b);return a[d+1]||""}if(d==="$")return"$";if(d==="&"||+d===0)return a[0];if(d==="`")return a[a.length-1].slice(0,a[a.length-2]);if(d==="'")return a[a.length-1].slice(a[a.length-2]+a[0].length);d=+d;if(!isNaN(d)){if(d>a.length-3)throw new SyntaxError("Backreference to undefined group "+
2
- b);return a[d]||""}throw new SyntaxError("Invalid token "+b);})});c&&(a.lastIndex=a.global?0:d);return g};k.split=function(a,b){if(!f.isRegExp(a))return l.split.apply(this,arguments);var c=String(this),d=[],e=a.lastIndex,g=0,h,b=(void 0===b?-1:b)>>>0;f.forEach(c,a,function(a){a.index+a[0].length>g&&(d.push(c.slice(g,a.index)),1<a.length&&a.index<c.length&&Array.prototype.push.apply(d,a.slice(1)),h=a[0].length,g=a.index+h)});g===c.length?(!l.test.call(a,"")||h)&&d.push(""):d.push(c.slice(g));a.lastIndex=e;return d.length>b?d.slice(0,b):d};t=f.addToken;t(/\\([ABCE-RTUVXYZaeg-mopqyz]|c(?![A-Za-z])|u(?![\dA-Fa-f]{4})|x(?![\dA-Fa-f]{2}))/,function(a,b){if("B"===a[1]&&"default"===b)return a[0];throw new SyntaxError("Invalid escape "+a[0]);},{scope:"all"});t(/\[(\^?)]/,function(a){return a[1]?"[\\s\\S]":"\\b\\B"});t(/\(\?#[^)]*\)/,function(a,b,c){return K(a.input,a.index+a[0].length,c)?"":"(?:)"});t(/\s+|#.*/,function(a,b,c){return K(a.input,a.index+a[0].length,c)?"":"(?:)"},{flag:"x"});t(/\./,function(){return"[\\s\\S]"},{flag:"s"});t(/\\k<([\w$]+)>/,function(a){var b=isNaN(a[1])?y(this.captureNames,a[1])+1:+a[1],c=a.index+a[0].length;if(!b||b>this.captureNames.length)throw new SyntaxError("Backreference to undefined group "+a[0]);return"\\"+b+(c===a.input.length||isNaN(a.input.charAt(c))?"":"(?:)")});t(/\\(\d+)/,function(a,b){if(!("default"===b&&/^[1-9]/.test(a[1])&&+a[1]<=this.captureNames.length)&&"0"!==a[1])throw new SyntaxError("Cannot use octal escape or backreference to undefined group "+a[0]);return a[0]},{scope:"all"});t(/\(\?P?<([\w$]+)>/,function(a){if(!isNaN(a[1]))throw new SyntaxError("Cannot use integer as capture name "+a[0]);if("length"===a[1]||"__proto__"===a[1])throw new SyntaxError("Cannot use reserved word as capture name "+a[0]);if(-1<y(this.captureNames,a[1]))throw new SyntaxError("Cannot use same name for multiple groups "+a[0]);this.captureNames.push(a[1]);this.hasNamedCapture=!0;return"("});t(/\((?!\?)/,function(a,b,c){if(-1<c.indexOf("n"))return"(?:";this.captureNames.push(null);return"("},{optionalFlags:"n"});g=f;var Q=function(a){return g.isRegExp(a)?a[A]&&a[A].captureNames?a:g(a.source):g(a)},A="xregexp",R=/(\()(?!\?)|\\([1-9]\d*)|\\[\s\S]|\[(?:[^\\\]]|\\[\s\S])*]/g,W=g.union([/\({{([\w$]+)}}\)|{{([\w$]+)}}/,R],"g");g.build=function(a,b,c){var d=/^\(\?([\w$]+)\)/.exec(a),e={},f=0,h,i=0,l=[0],m,j;d&&(c=c||"",d[1].replace(/./g,function(a){c+=-1<c.indexOf(a)?"":a}));for(j in b)if(b.hasOwnProperty(j)){var d=Q(b[j]),k=e,q=j,p;p=d.source;var o=/^\^/,r=/\$$/;p=o.test(p)&&r.test(p.replace(/\\[\s\S]/g,""))?p.replace(o,"").replace(r,""):p;k[q]={pattern:p,names:d[A].captureNames||[]}}a=Q(a);m=a[A].captureNames||[];a=a.source.replace(W,function(a,b,c,d,g){var j=b||c,k;if(j){if(!e.hasOwnProperty(j))throw new ReferenceError("Undefined property "+a);if(b){k=m[i];l[++i]=++f;a="(?<"+(k||j)+">"}else a="(?:";h=f;return a+e[j].pattern.replace(R,function(a,b,c){if(b){k=e[j].names[f-h];++f;if(k)return"(?<"+k+">"}else if(c)return"\\"+(+c+h);return a})+")"}if(d){k=m[i];l[++i]=++f;if(k)return"(?<"+k+">"}else if(g)return"\\"+
3
- l[+g];return a});return g(a,c)};var x=function(a,b,c,d){return{name:a,value:b,start:c,end:d}};g.matchRecursive=function(a,b,c,d,e){var d=d||"",e=e||{},f=-1<d.indexOf("g"),h=-1<d.indexOf("y"),i=d.replace(/y/g,""),j=e.escapeChar,e=e.valueNames,m=[],l=0,k=0,q=0,p=0,o,r,s,b=g(b,i),c=g(c,i);if(j){if(1<j.length)throw Error("Cannot use more than one escape character");j=g.escape(j);s=RegExp("(?:"+j+"[\\S\\s]|(?:(?!"+g.union([b,c]).source+")[^"+j+"])+)+",d.replace(/[^im]+/g,""))}for(;;){j&&(q+=(g.exec(a,s,q,"sticky")||[""])[0].length);d=g.exec(a,b,q);i=g.exec(a,c,q);d&&i&&(d.index<=i.index?i=null:d=null);if(d||i)k=(d||i).index,q=k+(d||i)[0].length;else if(!l)break;if(h&&!l&&k>p)break;if(d)l||(o=k,r=q),++l;else if(i&&l){if(!--l&&(e?(e[0]&&o>p&&m.push(x(e[0],a.slice(p,o),p,o)),e[1]&&m.push(x(e[1],a.slice(o,r),o,r)),e[2]&&m.push(x(e[2],a.slice(r,k),r,k)),e[3]&&m.push(x(e[3],a.slice(k,q),k,q))):m.push(a.slice(r,k)),p=q,!f))break}else throw Error("Unbalanced delimiter found in string");k===q&&++q}f&&(!h&&e&&e[0]&&a.length>p)&&m.push(x(e[0],a.slice(p),p,a.length));return m};var B=function(a){return a.replace(/[- _]+/g,"").toLowerCase()},H=function(a){for(;4>a.length;)a="0"+a;return a},S=function(a){var b=/^\\[xu](.+)/.exec(a);return b?parseInt(b[1],16):a.charCodeAt("\\"===a.charAt(0)?1:0)},o={};g.addToken(/\\([pP])(?:{(\^?)([^}]*)}|([A-Za-z]))/,function(a,b,c){var d="P"===a[1]||!!a[2],e=-1<c.indexOf("A")||g.isInstalled("astral"),c=B(a[4]||a[3]),f=o[c];if("P"===a[1]&&a[2])throw new SyntaxError("Invalid double negation "+
4
- a[0]);if(!o.hasOwnProperty(c))throw new SyntaxError("Unknown Unicode token "+a[0]);if(f.inverseOf){c=B(f.inverseOf);if(!o.hasOwnProperty(c))throw new ReferenceError("Unicode token missing data "+a[0]+" -> "+f.inverseOf);f=o[c];d=!d}if(!f.bmp&&!e)throw new SyntaxError("Astral mode required for Unicode token "+a[0]);if(e){if("class"===b)throw new SyntaxError("Astral mode does not support Unicode tokens within character classes");a=d?"a!":"a=";if(!(b=o[c][a]))b=o[c],c=o[c],e="",c.bmp&&!c.isBmpLast&&(e="["+c.bmp+"]"+(c.astral?"|":"")),c.astral&&(e+=c.astral),c.isBmpLast&&c.bmp&&(e+=(c.astral?"|":"")+"["+c.bmp+"]"),b=b[a]=d?"(?:(?!"+e+")(?:[\ud800-\udbff][\udc00-\udfff]|[\x00-\uffff]))":"(?:"+e+")";return b}if("class"===b)if(d){if(!(d=o[c]["b!"])){var d=o[c],h="",i=-1,j;g.forEach(o[c].bmp,/(\\x..|\\u....|\\?[\s\S])(?:-(\\x..|\\u....|\\?[\s\S]))?/,function(a){j=S(a[1]);j>i+1&&(h+="\\u"+H(parseInt(i+1,10).toString(16)),j>i+2&&(h+="-\\u"+H(parseInt(j-1,10).toString(16))));i=S(a[2]||a[1])});65535>i&&(h+="\\u"+H(parseInt(i+1,10).toString(16)),65534>i&&(h+="-\\uFFFF"));d=d["b!"]=h}}else d=f.bmp;else d=(d?"[^":"[")+f.bmp+"]";return d},{scope:"all",optionalFlags:"A"});g.addUnicodeData=function(a){var b,c;for(c=0;c<a.length;++c){b=a[c];if(!b.name)throw Error("Unicode token requires name");if(!b.inverseOf&&!b.bmp&&!b.astral)throw Error("Unicode token has no character data "+b.name);o[B(b.name)]=b;b.alias&&(o[B(b.alias)]=b)}g.cache.flush("patterns")};g.addUnicodeData([{name:"L",alias:"Letter",bmp:"A-Za-z\u00aa\u00b5\u00ba\u00c0-\u00d6\u00d8-\u00f6\u00f8-\u02c1\u02c6-\u02d1\u02e0-\u02e4\u02ec\u02ee\u0370-\u0374\u0376\u0377\u037a-\u037d\u0386\u0388-\u038a\u038c\u038e-\u03a1\u03a3-\u03f5\u03f7-\u0481\u048a-\u0527\u0531-\u0556\u0559\u0561-\u0587\u05d0-\u05ea\u05f0-\u05f2\u0620-\u064a\u066e\u066f\u0671-\u06d3\u06d5\u06e5\u06e6\u06ee\u06ef\u06fa-\u06fc\u06ff\u0710\u0712-\u072f\u074d-\u07a5\u07b1\u07ca-\u07ea\u07f4\u07f5\u07fa\u0800-\u0815\u081a\u0824\u0828\u0840-\u0858\u08a0\u08a2-\u08ac\u0904-\u0939\u093d\u0950\u0958-\u0961\u0971-\u0977\u0979-\u097f\u0985-\u098c\u098f\u0990\u0993-\u09a8\u09aa-\u09b0\u09b2\u09b6-\u09b9\u09bd\u09ce\u09dc\u09dd\u09df-\u09e1\u09f0\u09f1\u0a05-\u0a0a\u0a0f\u0a10\u0a13-\u0a28\u0a2a-\u0a30\u0a32\u0a33\u0a35\u0a36\u0a38\u0a39\u0a59-\u0a5c\u0a5e\u0a72-\u0a74\u0a85-\u0a8d\u0a8f-\u0a91\u0a93-\u0aa8\u0aaa-\u0ab0\u0ab2\u0ab3\u0ab5-\u0ab9\u0abd\u0ad0\u0ae0\u0ae1\u0b05-\u0b0c\u0b0f\u0b10\u0b13-\u0b28\u0b2a-\u0b30\u0b32\u0b33\u0b35-\u0b39\u0b3d\u0b5c\u0b5d\u0b5f-\u0b61\u0b71\u0b83\u0b85-\u0b8a\u0b8e-\u0b90\u0b92-\u0b95\u0b99\u0b9a\u0b9c\u0b9e\u0b9f\u0ba3\u0ba4\u0ba8-\u0baa\u0bae-\u0bb9\u0bd0\u0c05-\u0c0c\u0c0e-\u0c10\u0c12-\u0c28\u0c2a-\u0c33\u0c35-\u0c39\u0c3d\u0c58\u0c59\u0c60\u0c61\u0c85-\u0c8c\u0c8e-\u0c90\u0c92-\u0ca8\u0caa-\u0cb3\u0cb5-\u0cb9\u0cbd\u0cde\u0ce0\u0ce1\u0cf1\u0cf2\u0d05-\u0d0c\u0d0e-\u0d10\u0d12-\u0d3a\u0d3d\u0d4e\u0d60\u0d61\u0d7a-\u0d7f\u0d85-\u0d96\u0d9a-\u0db1\u0db3-\u0dbb\u0dbd\u0dc0-\u0dc6\u0e01-\u0e30\u0e32\u0e33\u0e40-\u0e46\u0e81\u0e82\u0e84\u0e87\u0e88\u0e8a\u0e8d\u0e94-\u0e97\u0e99-\u0e9f\u0ea1-\u0ea3\u0ea5\u0ea7\u0eaa\u0eab\u0ead-\u0eb0\u0eb2\u0eb3\u0ebd\u0ec0-\u0ec4\u0ec6\u0edc-\u0edf\u0f00\u0f40-\u0f47\u0f49-\u0f6c\u0f88-\u0f8c\u1000-\u102a\u103f\u1050-\u1055\u105a-\u105d\u1061\u1065\u1066\u106e-\u1070\u1075-\u1081\u108e\u10a0-\u10c5\u10c7\u10cd\u10d0-\u10fa\u10fc-\u1248\u124a-\u124d\u1250-\u1256\u1258\u125a-\u125d\u1260-\u1288\u128a-\u128d\u1290-\u12b0\u12b2-\u12b5\u12b8-\u12be\u12c0\u12c2-\u12c5\u12c8-\u12d6\u12d8-\u1310\u1312-\u1315\u1318-\u135a\u1380-\u138f\u13a0-\u13f4\u1401-\u166c\u166f-\u167f\u1681-\u169a\u16a0-\u16ea\u1700-\u170c\u170e-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176c\u176e-\u1770\u1780-\u17b3\u17d7\u17dc\u1820-\u1877\u1880-\u18a8\u18aa\u18b0-\u18f5\u1900-\u191c\u1950-\u196d\u1970-\u1974\u1980-\u19ab\u19c1-\u19c7\u1a00-\u1a16\u1a20-\u1a54\u1aa7\u1b05-\u1b33\u1b45-\u1b4b\u1b83-\u1ba0\u1bae\u1baf\u1bba-\u1be5\u1c00-\u1c23\u1c4d-\u1c4f\u1c5a-\u1c7d\u1ce9-\u1cec\u1cee-\u1cf1\u1cf5\u1cf6\u1d00-\u1dbf\u1e00-\u1f15\u1f18-\u1f1d\u1f20-\u1f45\u1f48-\u1f4d\u1f50-\u1f57\u1f59\u1f5b\u1f5d\u1f5f-\u1f7d\u1f80-\u1fb4\u1fb6-\u1fbc\u1fbe\u1fc2-\u1fc4\u1fc6-\u1fcc\u1fd0-\u1fd3\u1fd6-\u1fdb\u1fe0-\u1fec\u1ff2-\u1ff4\u1ff6-\u1ffc\u2071\u207f\u2090-\u209c\u2102\u2107\u210a-\u2113\u2115\u2119-\u211d\u2124\u2126\u2128\u212a-\u212d\u212f-\u2139\u213c-\u213f\u2145-\u2149\u214e\u2183\u2184\u2c00-\u2c2e\u2c30-\u2c5e\u2c60-\u2ce4\u2ceb-\u2cee\u2cf2\u2cf3\u2d00-\u2d25\u2d27\u2d2d\u2d30-\u2d67\u2d6f\u2d80-\u2d96\u2da0-\u2da6\u2da8-\u2dae\u2db0-\u2db6\u2db8-\u2dbe\u2dc0-\u2dc6\u2dc8-\u2dce\u2dd0-\u2dd6\u2dd8-\u2dde\u2e2f\u3005\u3006\u3031-\u3035\u303b\u303c\u3041-\u3096\u309d-\u309f\u30a1-\u30fa\u30fc-\u30ff\u3105-\u312d\u3131-\u318e\u31a0-\u31ba\u31f0-\u31ff\u3400-\u4db5\u4e00-\u9fcc\ua000-\ua48c\ua4d0-\ua4fd\ua500-\ua60c\ua610-\ua61f\ua62a\ua62b\ua640-\ua66e\ua67f-\ua697\ua6a0-\ua6e5\ua717-\ua71f\ua722-\ua788\ua78b-\ua78e\ua790-\ua793\ua7a0-\ua7aa\ua7f8-\ua801\ua803-\ua805\ua807-\ua80a\ua80c-\ua822\ua840-\ua873\ua882-\ua8b3\ua8f2-\ua8f7\ua8fb\ua90a-\ua925\ua930-\ua946\ua960-\ua97c\ua984-\ua9b2\ua9cf\uaa00-\uaa28\uaa40-\uaa42\uaa44-\uaa4b\uaa60-\uaa76\uaa7a\uaa80-\uaaaf\uaab1\uaab5\uaab6\uaab9-\uaabd\uaac0\uaac2\uaadb-\uaadd\uaae0-\uaaea\uaaf2-\uaaf4\uab01-\uab06\uab09-\uab0e\uab11-\uab16\uab20-\uab26\uab28-\uab2e\uabc0-\uabe2\uac00-\ud7a3\ud7b0-\ud7c6\ud7cb-\ud7fb\uf900-\ufa6d\ufa70-\ufad9\ufb00-\ufb06\ufb13-\ufb17\ufb1d\ufb1f-\ufb28\ufb2a-\ufb36\ufb38-\ufb3c\ufb3e\ufb40\ufb41\ufb43\ufb44\ufb46-\ufbb1\ufbd3-\ufd3d\ufd50-\ufd8f\ufd92-\ufdc7\ufdf0-\ufdfb\ufe70-\ufe74\ufe76-\ufefc\uff21-\uff3a\uff41-\uff5a\uff66-\uffbe\uffc2-\uffc7\uffca-\uffcf\uffd2-\uffd7\uffda-\uffdc",astral:"\ud802[\udc00-\udc05\udc08\udc0a-\udc35\udc37\udc38\udc3c\udc3f-\udc55\udd00-\udd15\udd20-\udd39\udd80-\uddb7\uddbe\uddbf\ude00\ude10-\ude13\ude15-\ude17\ude19-\ude33\ude60-\ude7c\udf00-\udf35\udf40-\udf55\udf60-\udf72]|\ud801[\udc00-\udc9d]|\ud800[\udc00-\udc0b\udc0d-\udc26\udc28-\udc3a\udc3c\udc3d\udc3f-\udc4d\udc50-\udc5d\udc80-\udcfa\ude80-\ude9c\udea0-\uded0\udf00-\udf1e\udf30-\udf40\udf42-\udf49\udf80-\udf9d\udfa0-\udfc3\udfc8-\udfcf]|\ud81a[\udc00-\ude38]|\ud804[\udc03-\udc37\udc83-\udcaf\udcd0-\udce8\udd03-\udd26\udd83-\uddb2\uddc1-\uddc4]|\ud86e[\udc00-\udc1d]|\ud86d[\udc00-\udf34\udf40-\udfff]|\ud803[\udc00-\udc48]|\ud80d[\udc00-\udc2e]|\ud805[\ude80-\udeaa]|\ud87e[\udc00-\ude1d]|\ud81b[\udf00-\udf44\udf50\udf93-\udf9f]|\ud869[\udc00-\uded6\udf00-\udfff]|\ud82c[\udc00\udc01]|[\ud80c\ud840-\ud868\ud86a-\ud86c][\udc00-\udfff]|\ud83b[\ude00-\ude03\ude05-\ude1f\ude21\ude22\ude24\ude27\ude29-\ude32\ude34-\ude37\ude39\ude3b\ude42\ude47\ude49\ude4b\ude4d-\ude4f\ude51\ude52\ude54\ude57\ude59\ude5b\ude5d\ude5f\ude61\ude62\ude64\ude67-\ude6a\ude6c-\ude72\ude74-\ude77\ude79-\ude7c\ude7e\ude80-\ude89\ude8b-\ude9b\udea1-\udea3\udea5-\udea9\udeab-\udebb]|\ud835[\udc00-\udc54\udc56-\udc9c\udc9e\udc9f\udca2\udca5\udca6\udca9-\udcac\udcae-\udcb9\udcbb\udcbd-\udcc3\udcc5-\udd05\udd07-\udd0a\udd0d-\udd14\udd16-\udd1c\udd1e-\udd39\udd3b-\udd3e\udd40-\udd44\udd46\udd4a-\udd50\udd52-\udea5\udea8-\udec0\udec2-\udeda\udedc-\udefa\udefc-\udf14\udf16-\udf34\udf36-\udf4e\udf50-\udf6e\udf70-\udf88\udf8a-\udfa8\udfaa-\udfc2\udfc4-\udfcb]|\ud808[\udc00-\udf6e]"}]);if(!g.addUnicodeData)throw new ReferenceError("Unicode Base must be loaded before Unicode Blocks");g.addUnicodeData([{name:"InAegean_Numbers",astral:"\ud800[\udd00-\udd3f]"},{name:"InAlchemical_Symbols",astral:"\ud83d[\udf00-\udf7f]"},{name:"InAlphabetic_Presentation_Forms",bmp:"\ufb00-\ufb4f"},{name:"InAncient_Greek_Musical_Notation",astral:"\ud834[\ude00-\ude4f]"},{name:"InAncient_Greek_Numbers",astral:"\ud800[\udd40-\udd8f]"},{name:"InAncient_Symbols",astral:"\ud800[\udd90-\uddcf]"},{name:"InArabic",bmp:"\u0600-\u06ff"},{name:"InArabic_Extended_A",bmp:"\u08a0-\u08ff"},{name:"InArabic_Mathematical_Alphabetic_Symbols",astral:"\ud83b[\ude00-\udeff]"},{name:"InArabic_Presentation_Forms_A",bmp:"\ufb50-\ufdff"},{name:"InArabic_Presentation_Forms_B",bmp:"\ufe70-\ufeff"},{name:"InArabic_Supplement",bmp:"\u0750-\u077f"},{name:"InArmenian",bmp:"\u0530-\u058f"},{name:"InArrows",bmp:"\u2190-\u21ff"},{name:"InAvestan",astral:"\ud802[\udf00-\udf3f]"},{name:"InBalinese",bmp:"\u1b00-\u1b7f"},{name:"InBamum",bmp:"\ua6a0-\ua6ff"},{name:"InBamum_Supplement",astral:"\ud81a[\udc00-\ude3f]"},{name:"InBasic_Latin",bmp:"\x00-\u007f"},{name:"InBatak",bmp:"\u1bc0-\u1bff"},{name:"InBengali",bmp:"\u0980-\u09ff"},{name:"InBlock_Elements",bmp:"\u2580-\u259f"},{name:"InBopomofo",bmp:"\u3100-\u312f"},{name:"InBopomofo_Extended",bmp:"\u31a0-\u31bf"},{name:"InBox_Drawing",bmp:"\u2500-\u257f"},{name:"InBrahmi",astral:"\ud804[\udc00-\udc7f]"},{name:"InBraille_Patterns",bmp:"\u2800-\u28ff"},{name:"InBuginese",bmp:"\u1a00-\u1a1f"},{name:"InBuhid",bmp:"\u1740-\u175f"},{name:"InByzantine_Musical_Symbols",astral:"\ud834[\udc00-\udcff]"},{name:"InCJK_Compatibility",bmp:"\u3300-\u33ff"},{name:"InCJK_Compatibility_Forms",bmp:"\ufe30-\ufe4f"},{name:"InCJK_Compatibility_Ideographs",bmp:"\uf900-\ufaff"},{name:"InCJK_Compatibility_Ideographs_Supplement",astral:"\ud87e[\udc00-\ude1f]"},{name:"InCJK_Radicals_Supplement",bmp:"\u2e80-\u2eff"},{name:"InCJK_Strokes",bmp:"\u31c0-\u31ef"},{name:"InCJK_Symbols_and_Punctuation",bmp:"\u3000-\u303f"},{name:"InCJK_Unified_Ideographs",bmp:"\u4e00-\u9fff"},{name:"InCJK_Unified_Ideographs_Extension_A",bmp:"\u3400-\u4dbf"},{name:"InCJK_Unified_Ideographs_Extension_B",astral:"[\ud840-\ud868][\udc00-\udfff]|\ud869[\udc00-\udedf]"},{name:"InCJK_Unified_Ideographs_Extension_C",astral:"\ud86d[\udc00-\udf3f]|[\ud86a-\ud86c][\udc00-\udfff]|\ud869[\udf00-\udfff]"},{name:"InCJK_Unified_Ideographs_Extension_D",astral:"\ud86d[\udf40-\udfff]|\ud86e[\udc00-\udc1f]"},{name:"InCarian",astral:"\ud800[\udea0-\udedf]"},{name:"InChakma",astral:"\ud804[\udd00-\udd4f]"},{name:"InCham",bmp:"\uaa00-\uaa5f"},{name:"InCherokee",bmp:"\u13a0-\u13ff"},{name:"InCombining_Diacritical_Marks",bmp:"\u0300-\u036f"},{name:"InCombining_Diacritical_Marks_Supplement",bmp:"\u1dc0-\u1dff"},{name:"InCombining_Diacritical_Marks_for_Symbols",bmp:"\u20d0-\u20ff"},{name:"InCombining_Half_Marks",bmp:"\ufe20-\ufe2f"},{name:"InCommon_Indic_Number_Forms",bmp:"\ua830-\ua83f"},{name:"InControl_Pictures",bmp:"\u2400-\u243f"},{name:"InCoptic",bmp:"\u2c80-\u2cff"},{name:"InCounting_Rod_Numerals",astral:"\ud834[\udf60-\udf7f]"},{name:"InCuneiform",astral:"\ud808[\udc00-\udfff]"},{name:"InCuneiform_Numbers_and_Punctuation",astral:"\ud809[\udc00-\udc7f]"},{name:"InCurrency_Symbols",bmp:"\u20a0-\u20cf"},{name:"InCypriot_Syllabary",astral:"\ud802[\udc00-\udc3f]"},{name:"InCyrillic",bmp:"\u0400-\u04ff"},{name:"InCyrillic_Extended_A",bmp:"\u2de0-\u2dff"},{name:"InCyrillic_Extended_B",bmp:"\ua640-\ua69f"},{name:"InCyrillic_Supplement",bmp:"\u0500-\u052f"},{name:"InDeseret",astral:"\ud801[\udc00-\udc4f]"},{name:"InDevanagari",bmp:"\u0900-\u097f"},{name:"InDevanagari_Extended",bmp:"\ua8e0-\ua8ff"},{name:"InDingbats",bmp:"\u2700-\u27bf"},{name:"InDomino_Tiles",astral:"\ud83c[\udc30-\udc9f]"},{name:"InEgyptian_Hieroglyphs",astral:"\ud80c[\udc00-\udfff]|\ud80d[\udc00-\udc2f]"},{name:"InEmoticons",astral:"\ud83d[\ude00-\ude4f]"},{name:"InEnclosed_Alphanumeric_Supplement",astral:"\ud83c[\udd00-\uddff]"},{name:"InEnclosed_Alphanumerics",bmp:"\u2460-\u24ff"},{name:"InEnclosed_CJK_Letters_and_Months",bmp:"\u3200-\u32ff"},{name:"InEnclosed_Ideographic_Supplement",astral:"\ud83c[\ude00-\udeff]"},{name:"InEthiopic",bmp:"\u1200-\u137f"},{name:"InEthiopic_Extended",bmp:"\u2d80-\u2ddf"},{name:"InEthiopic_Extended_A",bmp:"\uab00-\uab2f"},{name:"InEthiopic_Supplement",bmp:"\u1380-\u139f"},{name:"InGeneral_Punctuation",bmp:"\u2000-\u206f"},{name:"InGeometric_Shapes",bmp:"\u25a0-\u25ff"},{name:"InGeorgian",bmp:"\u10a0-\u10ff"},{name:"InGeorgian_Supplement",bmp:"\u2d00-\u2d2f"},{name:"InGlagolitic",bmp:"\u2c00-\u2c5f"},{name:"InGothic",astral:"\ud800[\udf30-\udf4f]"},{name:"InGreek_Extended",bmp:"\u1f00-\u1fff"},{name:"InGreek_and_Coptic",bmp:"\u0370-\u03ff"},{name:"InGujarati",bmp:"\u0a80-\u0aff"},{name:"InGurmukhi",bmp:"\u0a00-\u0a7f"},{name:"InHalfwidth_and_Fullwidth_Forms",bmp:"\uff00-\uffef"},{name:"InHangul_Compatibility_Jamo",bmp:"\u3130-\u318f"},{name:"InHangul_Jamo",bmp:"\u1100-\u11ff"},{name:"InHangul_Jamo_Extended_A",bmp:"\ua960-\ua97f"},{name:"InHangul_Jamo_Extended_B",bmp:"\ud7b0-\ud7ff"},{name:"InHangul_Syllables",bmp:"\uac00-\ud7af"},{name:"InHanunoo",bmp:"\u1720-\u173f"},{name:"InHebrew",bmp:"\u0590-\u05ff"},{name:"InHigh_Private_Use_Surrogates",bmp:"\udb80-\udbff"},{name:"InHigh_Surrogates",bmp:"\ud800-\udb7f"},{name:"InHiragana",bmp:"\u3040-\u309f"},{name:"InIPA_Extensions",bmp:"\u0250-\u02af"},{name:"InIdeographic_Description_Characters",bmp:"\u2ff0-\u2fff"},{name:"InImperial_Aramaic",astral:"\ud802[\udc40-\udc5f]"},{name:"InInscriptional_Pahlavi",astral:"\ud802[\udf60-\udf7f]"},{name:"InInscriptional_Parthian",astral:"\ud802[\udf40-\udf5f]"},{name:"InJavanese",bmp:"\ua980-\ua9df"},{name:"InKaithi",astral:"\ud804[\udc80-\udccf]"},{name:"InKana_Supplement",astral:"\ud82c[\udc00-\udcff]"},{name:"InKanbun",bmp:"\u3190-\u319f"},{name:"InKangxi_Radicals",bmp:"\u2f00-\u2fdf"},{name:"InKannada",bmp:"\u0c80-\u0cff"},{name:"InKatakana",bmp:"\u30a0-\u30ff"},{name:"InKatakana_Phonetic_Extensions",bmp:"\u31f0-\u31ff"},{name:"InKayah_Li",bmp:"\ua900-\ua92f"},{name:"InKharoshthi",astral:"\ud802[\ude00-\ude5f]"},{name:"InKhmer",bmp:"\u1780-\u17ff"},{name:"InKhmer_Symbols",bmp:"\u19e0-\u19ff"},{name:"InLao",bmp:"\u0e80-\u0eff"},{name:"InLatin_Extended_Additional",bmp:"\u1e00-\u1eff"},{name:"InLatin_Extended_A",bmp:"\u0100-\u017f"},{name:"InLatin_Extended_B",bmp:"\u0180-\u024f"},{name:"InLatin_Extended_C",bmp:"\u2c60-\u2c7f"},{name:"InLatin_Extended_D",bmp:"\ua720-\ua7ff"},{name:"InLatin_1_Supplement",bmp:"\u0080-\u00ff"},{name:"InLepcha",bmp:"\u1c00-\u1c4f"},{name:"InLetterlike_Symbols",bmp:"\u2100-\u214f"},{name:"InLimbu",bmp:"\u1900-\u194f"},{name:"InLinear_B_Ideograms",astral:"\ud800[\udc80-\udcff]"},{name:"InLinear_B_Syllabary",astral:"\ud800[\udc00-\udc7f]"},{name:"InLisu",bmp:"\ua4d0-\ua4ff"},{name:"InLow_Surrogates",bmp:"\udc00-\udfff"},{name:"InLycian",astral:"\ud800[\ude80-\ude9f]"},{name:"InLydian",astral:"\ud802[\udd20-\udd3f]"},{name:"InMahjong_Tiles",astral:"\ud83c[\udc00-\udc2f]"},{name:"InMalayalam",bmp:"\u0d00-\u0d7f"},{name:"InMandaic",bmp:"\u0840-\u085f"},{name:"InMathematical_Alphanumeric_Symbols",astral:"\ud835[\udc00-\udfff]"},{name:"InMathematical_Operators",bmp:"\u2200-\u22ff"},{name:"InMeetei_Mayek",bmp:"\uabc0-\uabff"},{name:"InMeetei_Mayek_Extensions",bmp:"\uaae0-\uaaff"},{name:"InMeroitic_Cursive",astral:"\ud802[\udda0-\uddff]"},{name:"InMeroitic_Hieroglyphs",astral:"\ud802[\udd80-\udd9f]"},{name:"InMiao",astral:"\ud81b[\udf00-\udf9f]"},{name:"InMiscellaneous_Mathematical_Symbols_A",bmp:"\u27c0-\u27ef"},{name:"InMiscellaneous_Mathematical_Symbols_B",bmp:"\u2980-\u29ff"},{name:"InMiscellaneous_Symbols",bmp:"\u2600-\u26ff"},{name:"InMiscellaneous_Symbols_And_Pictographs",astral:"\ud83d[\udc00-\uddff]|\ud83c[\udf00-\udfff]"},{name:"InMiscellaneous_Symbols_and_Arrows",bmp:"\u2b00-\u2bff"},{name:"InMiscellaneous_Technical",bmp:"\u2300-\u23ff"},{name:"InModifier_Tone_Letters",bmp:"\ua700-\ua71f"},{name:"InMongolian",bmp:"\u1800-\u18af"},{name:"InMusical_Symbols",astral:"\ud834[\udd00-\uddff]"},{name:"InMyanmar",bmp:"\u1000-\u109f"},{name:"InMyanmar_Extended_A",bmp:"\uaa60-\uaa7f"},{name:"InNKo",bmp:"\u07c0-\u07ff"},{name:"InNew_Tai_Lue",bmp:"\u1980-\u19df"},{name:"InNumber_Forms",bmp:"\u2150-\u218f"},{name:"InOgham",bmp:"\u1680-\u169f"},{name:"InOl_Chiki",bmp:"\u1c50-\u1c7f"},{name:"InOld_Italic",astral:"\ud800[\udf00-\udf2f]"},{name:"InOld_Persian",astral:"\ud800[\udfa0-\udfdf]"},{name:"InOld_South_Arabian",astral:"\ud802[\ude60-\ude7f]"},{name:"InOld_Turkic",astral:"\ud803[\udc00-\udc4f]"},{name:"InOptical_Character_Recognition",bmp:"\u2440-\u245f"},{name:"InOriya",bmp:"\u0b00-\u0b7f"},{name:"InOsmanya",astral:"\ud801[\udc80-\udcaf]"},{name:"InPhags_pa",bmp:"\ua840-\ua87f"},{name:"InPhaistos_Disc",astral:"\ud800[\uddd0-\uddff]"},{name:"InPhoenician",astral:"\ud802[\udd00-\udd1f]"},{name:"InPhonetic_Extensions",bmp:"\u1d00-\u1d7f"},{name:"InPhonetic_Extensions_Supplement",bmp:"\u1d80-\u1dbf"},{name:"InPlaying_Cards",astral:"\ud83c[\udca0-\udcff]"},{name:"InPrivate_Use_Area",bmp:"\ue000-\uf8ff"},{name:"InRejang",bmp:"\ua930-\ua95f"},{name:"InRumi_Numeral_Symbols",astral:"\ud803[\ude60-\ude7f]"},{name:"InRunic",bmp:"\u16a0-\u16ff"},{name:"InSamaritan",bmp:"\u0800-\u083f"},{name:"InSaurashtra",bmp:"\ua880-\ua8df"},{name:"InSharada",astral:"\ud804[\udd80-\udddf]"},{name:"InShavian",astral:"\ud801[\udc50-\udc7f]"},{name:"InSinhala",bmp:"\u0d80-\u0dff"},{name:"InSmall_Form_Variants",bmp:"\ufe50-\ufe6f"},{name:"InSora_Sompeng",astral:"\ud804[\udcd0-\udcff]"},{name:"InSpacing_Modifier_Letters",bmp:"\u02b0-\u02ff"},{name:"InSpecials",bmp:"\ufff0-\uffff"},{name:"InSundanese",bmp:"\u1b80-\u1bbf"},{name:"InSundanese_Supplement",bmp:"\u1cc0-\u1ccf"},{name:"InSuperscripts_and_Subscripts",bmp:"\u2070-\u209f"},{name:"InSupplemental_Arrows_A",bmp:"\u27f0-\u27ff"},{name:"InSupplemental_Arrows_B",bmp:"\u2900-\u297f"},{name:"InSupplemental_Mathematical_Operators",bmp:"\u2a00-\u2aff"},{name:"InSupplemental_Punctuation",bmp:"\u2e00-\u2e7f"},{name:"InSupplementary_Private_Use_Area_A",astral:"[\udb80-\udbbf][\udc00-\udfff]"},{name:"InSupplementary_Private_Use_Area_B",astral:"[\udbc0-\udbff][\udc00-\udfff]"},{name:"InSyloti_Nagri",bmp:"\ua800-\ua82f"},{name:"InSyriac",bmp:"\u0700-\u074f"},{name:"InTagalog",bmp:"\u1700-\u171f"},{name:"InTagbanwa",bmp:"\u1760-\u177f"},{name:"InTags",astral:"\udb40[\udc00-\udc7f]"},{name:"InTai_Le",bmp:"\u1950-\u197f"},{name:"InTai_Tham",bmp:"\u1a20-\u1aaf"},{name:"InTai_Viet",bmp:"\uaa80-\uaadf"},{name:"InTai_Xuan_Jing_Symbols",astral:"\ud834[\udf00-\udf5f]"},{name:"InTakri",astral:"\ud805[\ude80-\udecf]"},{name:"InTamil",bmp:"\u0b80-\u0bff"},{name:"InTelugu",bmp:"\u0c00-\u0c7f"},{name:"InThaana",bmp:"\u0780-\u07bf"},{name:"InThai",bmp:"\u0e00-\u0e7f"},{name:"InTibetan",bmp:"\u0f00-\u0fff"},{name:"InTifinagh",bmp:"\u2d30-\u2d7f"},{name:"InTransport_And_Map_Symbols",astral:"\ud83d[\ude80-\udeff]"},{name:"InUgaritic",astral:"\ud800[\udf80-\udf9f]"},{name:"InUnified_Canadian_Aboriginal_Syllabics",bmp:"\u1400-\u167f"},{name:"InUnified_Canadian_Aboriginal_Syllabics_Extended",bmp:"\u18b0-\u18ff"},{name:"InVai",bmp:"\ua500-\ua63f"},{name:"InVariation_Selectors",bmp:"\ufe00-\ufe0f"},{name:"InVariation_Selectors_Supplement",astral:"\udb40[\udd00-\uddef]"},{name:"InVedic_Extensions",bmp:"\u1cd0-\u1cff"},{name:"InVertical_Forms",bmp:"\ufe10-\ufe1f"},{name:"InYi_Radicals",bmp:"\ua490-\ua4cf"},{name:"InYi_Syllables",bmp:"\ua000-\ua48f"},{name:"InYijing_Hexagram_Symbols",bmp:"\u4dc0-\u4dff"}]);if(!g.addUnicodeData)throw new ReferenceError("Unicode Base must be loaded before Unicode Categories");g.addUnicodeData([{name:"C",alias:"Other",isBmpLast:!0,bmp:"\x00-\u001f\u007f-\u009f\u00ad\u0378\u0379\u037f-\u0383\u038b\u038d\u03a2\u0528-\u0530\u0557\u0558\u0560\u0588\u058b-\u058e\u0590\u05c8-\u05cf\u05eb-\u05ef\u05f5-\u0605\u061c\u061d\u06dd\u070e\u070f\u074b\u074c\u07b2-\u07bf\u07fb-\u07ff\u082e\u082f\u083f\u085c\u085d\u085f-\u089f\u08a1\u08ad-\u08e3\u08ff\u0978\u0980\u0984\u098d\u098e\u0991\u0992\u09a9\u09b1\u09b3-\u09b5\u09ba\u09bb\u09c5\u09c6\u09c9\u09ca\u09cf-\u09d6\u09d8-\u09db\u09de\u09e4\u09e5\u09fc-\u0a00\u0a04\u0a0b-\u0a0e\u0a11\u0a12\u0a29\u0a31\u0a34\u0a37\u0a3a\u0a3b\u0a3d\u0a43-\u0a46\u0a49\u0a4a\u0a4e-\u0a50\u0a52-\u0a58\u0a5d\u0a5f-\u0a65\u0a76-\u0a80\u0a84\u0a8e\u0a92\u0aa9\u0ab1\u0ab4\u0aba\u0abb\u0ac6\u0aca\u0ace\u0acf\u0ad1-\u0adf\u0ae4\u0ae5\u0af2-\u0b00\u0b04\u0b0d\u0b0e\u0b11\u0b12\u0b29\u0b31\u0b34\u0b3a\u0b3b\u0b45\u0b46\u0b49\u0b4a\u0b4e-\u0b55\u0b58-\u0b5b\u0b5e\u0b64\u0b65\u0b78-\u0b81\u0b84\u0b8b-\u0b8d\u0b91\u0b96-\u0b98\u0b9b\u0b9d\u0ba0-\u0ba2\u0ba5-\u0ba7\u0bab-\u0bad\u0bba-\u0bbd\u0bc3-\u0bc5\u0bc9\u0bce\u0bcf\u0bd1-\u0bd6\u0bd8-\u0be5\u0bfb-\u0c00\u0c04\u0c0d\u0c11\u0c29\u0c34\u0c3a-\u0c3c\u0c45\u0c49\u0c4e-\u0c54\u0c57\u0c5a-\u0c5f\u0c64\u0c65\u0c70-\u0c77\u0c80\u0c81\u0c84\u0c8d\u0c91\u0ca9\u0cb4\u0cba\u0cbb\u0cc5\u0cc9\u0cce-\u0cd4\u0cd7-\u0cdd\u0cdf\u0ce4\u0ce5\u0cf0\u0cf3-\u0d01\u0d04\u0d0d\u0d11\u0d3b\u0d3c\u0d45\u0d49\u0d4f-\u0d56\u0d58-\u0d5f\u0d64\u0d65\u0d76-\u0d78\u0d80\u0d81\u0d84\u0d97-\u0d99\u0db2\u0dbc\u0dbe\u0dbf\u0dc7-\u0dc9\u0dcb-\u0dce\u0dd5\u0dd7\u0de0-\u0df1\u0df5-\u0e00\u0e3b-\u0e3e\u0e5c-\u0e80\u0e83\u0e85\u0e86\u0e89\u0e8b\u0e8c\u0e8e-\u0e93\u0e98\u0ea0\u0ea4\u0ea6\u0ea8\u0ea9\u0eac\u0eba\u0ebe\u0ebf\u0ec5\u0ec7\u0ece\u0ecf\u0eda\u0edb\u0ee0-\u0eff\u0f48\u0f6d-\u0f70\u0f98\u0fbd\u0fcd\u0fdb-\u0fff\u10c6\u10c8-\u10cc\u10ce\u10cf\u1249\u124e\u124f\u1257\u1259\u125e\u125f\u1289\u128e\u128f\u12b1\u12b6\u12b7\u12bf\u12c1\u12c6\u12c7\u12d7\u1311\u1316\u1317\u135b\u135c\u137d-\u137f\u139a-\u139f\u13f5-\u13ff\u169d-\u169f\u16f1-\u16ff\u170d\u1715-\u171f\u1737-\u173f\u1754-\u175f\u176d\u1771\u1774-\u177f\u17de\u17df\u17ea-\u17ef\u17fa-\u17ff\u180f\u181a-\u181f\u1878-\u187f\u18ab-\u18af\u18f6-\u18ff\u191d-\u191f\u192c-\u192f\u193c-\u193f\u1941-\u1943\u196e\u196f\u1975-\u197f\u19ac-\u19af\u19ca-\u19cf\u19db-\u19dd\u1a1c\u1a1d\u1a5f\u1a7d\u1a7e\u1a8a-\u1a8f\u1a9a-\u1a9f\u1aae-\u1aff\u1b4c-\u1b4f\u1b7d-\u1b7f\u1bf4-\u1bfb\u1c38-\u1c3a\u1c4a-\u1c4c\u1c80-\u1cbf\u1cc8-\u1ccf\u1cf7-\u1cff\u1de7-\u1dfb\u1f16\u1f17\u1f1e\u1f1f\u1f46\u1f47\u1f4e\u1f4f\u1f58\u1f5a\u1f5c\u1f5e\u1f7e\u1f7f\u1fb5\u1fc5\u1fd4\u1fd5\u1fdc\u1ff0\u1ff1\u1ff5\u1fff\u200b-\u200f\u202a-\u202e\u2060-\u206f\u2072\u2073\u208f\u209d-\u209f\u20bb-\u20cf\u20f1-\u20ff\u218a-\u218f\u23f4-\u23ff\u2427-\u243f\u244b-\u245f\u2700\u2b4d-\u2b4f\u2b5a-\u2bff\u2c2f\u2c5f\u2cf4-\u2cf8\u2d26\u2d28-\u2d2c\u2d2e\u2d2f\u2d68-\u2d6e\u2d71-\u2d7e\u2d97-\u2d9f\u2da7\u2daf\u2db7\u2dbf\u2dc7\u2dcf\u2dd7\u2ddf\u2e3c-\u2e7f\u2e9a\u2ef4-\u2eff\u2fd6-\u2fef\u2ffc-\u2fff\u3040\u3097\u3098\u3100-\u3104\u312e-\u3130\u318f\u31bb-\u31bf\u31e4-\u31ef\u321f\u32ff\u4db6-\u4dbf\u9fcd-\u9fff\ua48d-\ua48f\ua4c7-\ua4cf\ua62c-\ua63f\ua698-\ua69e\ua6f8-\ua6ff\ua78f\ua794-\ua79f\ua7ab-\ua7f7\ua82c-\ua82f\ua83a-\ua83f\ua878-\ua87f\ua8c5-\ua8cd\ua8da-\ua8df\ua8fc-\ua8ff\ua954-\ua95e\ua97d-\ua97f\ua9ce\ua9da-\ua9dd\ua9e0-\ua9ff\uaa37-\uaa3f\uaa4e\uaa4f\uaa5a\uaa5b\uaa7c-\uaa7f\uaac3-\uaada\uaaf7-\uab00\uab07\uab08\uab0f\uab10\uab17-\uab1f\uab27\uab2f-\uabbf\uabee\uabef\uabfa-\uabff\ud7a4-\ud7af\ud7c7-\ud7ca\ud7fc-\uf8ff\ufa6e\ufa6f\ufada-\ufaff\ufb07-\ufb12\ufb18-\ufb1c\ufb37\ufb3d\ufb3f\ufb42\ufb45\ufbc2-\ufbd2\ufd40-\ufd4f\ufd90\ufd91\ufdc8-\ufdef\ufdfe\ufdff\ufe1a-\ufe1f\ufe27-\ufe2f\ufe53\ufe67\ufe6c-\ufe6f\ufe75\ufefd-\uff00\uffbf-\uffc1\uffc8\uffc9\uffd0\uffd1\uffd8\uffd9\uffdd-\uffdf\uffe7\uffef-\ufffb\ufffe\uffff",astral:"\ud808[\udf6f-\udfff]|\ud809[\udc63-\udc6f\udc74-\udfff]|\ud804[\udc4e-\udc51\udc70-\udc7f\udcbd\udcc2-\udccf\udce9-\udcef\udcfa-\udcff\udd35\udd44-\udd7f\uddc9-\uddcf\uddda-\udfff]|\ud802[\udc06\udc07\udc09\udc36\udc39-\udc3b\udc3d\udc3e\udc56\udc60-\udcff\udd1c-\udd1e\udd3a-\udd3e\udd40-\udd7f\uddb8-\uddbd\uddc0-\uddff\ude04\ude07-\ude0b\ude14\ude18\ude34-\ude37\ude3b-\ude3e\ude48-\ude4f\ude59-\ude5f\ude80-\udeff\udf36-\udf38\udf56\udf57\udf73-\udf77\udf80-\udfff]|\ud86d[\udf35-\udf3f]|\ud81b[\udc00-\udeff\udf45-\udf4f\udf7f-\udf8e\udfa0-\udfff]|\ud86e[\udc1e-\udfff]|\ud800[\udc0c\udc27\udc3b\udc3e\udc4e\udc4f\udc5e-\udc7f\udcfb-\udcff\udd03-\udd06\udd34-\udd36\udd8b-\udd8f\udd9c-\uddcf\uddfe-\ude7f\ude9d-\ude9f\uded1-\udeff\udf1f\udf24-\udf2f\udf4b-\udf7f\udf9e\udfc4-\udfc7\udfd6-\udfff]|\ud869[\uded7-\udeff]|\ud83b[\udc00-\uddff\ude04\ude20\ude23\ude25\ude26\ude28\ude33\ude38\ude3a\ude3c-\ude41\ude43-\ude46\ude48\ude4a\ude4c\ude50\ude53\ude55\ude56\ude58\ude5a\ude5c\ude5e\ude60\ude63\ude65\ude66\ude6b\ude73\ude78\ude7d\ude7f\ude8a\ude9c-\udea0\udea4\udeaa\udebc-\udeef\udef2-\udfff]|\ud87e[\ude1e-\udfff]|\udb40[\udc00-\udcff\uddf0-\udfff]|\ud803[\udc49-\ude5f\ude7f-\udfff]|\ud80d[\udc2f-\udfff]|[\ud806\ud807\ud80a\ud80b\ud80e-\ud819\ud81c-\ud82b\ud82d-\ud833\ud836-\ud83a\ud83e\ud83f\ud86f-\ud87d\ud87f-\udb3f\udb41-\udbff][\udc00-\udfff]|\ud83d[\udc3f\udc41\udcf8\udcfd-\udcff\udd3e\udd3f\udd44-\udd4f\udd68-\uddfa\ude41-\ude44\ude50-\ude7f\udec6-\udeff\udf74-\udfff]|\ud83c[\udc2c-\udc2f\udc94-\udc9f\udcaf\udcb0\udcbf\udcc0\udcd0\udce0-\udcff\udd0b-\udd0f\udd2f\udd6c-\udd6f\udd9b-\udde5\ude03-\ude0f\ude3b-\ude3f\ude49-\ude4f\ude52-\udeff\udf21-\udf2f\udf36\udf7d-\udf7f\udf94-\udf9f\udfc5\udfcb-\udfdf\udff1-\udfff]|\ud835[\udc55\udc9d\udca0\udca1\udca3\udca4\udca7\udca8\udcad\udcba\udcbc\udcc4\udd06\udd0b\udd0c\udd15\udd1d\udd3a\udd3f\udd45\udd47-\udd49\udd51\udea6\udea7\udfcc\udfcd]|\ud81a[\ude39-\udfff]|\ud834[\udcf6-\udcff\udd27\udd28\udd73-\udd7a\uddde-\uddff\ude46-\udeff\udf57-\udf5f\udf72-\udfff]|\ud801[\udc9e\udc9f\udcaa-\udfff]|\ud805[\udc00-\ude7f\udeb8-\udebf\udeca-\udfff]|\ud82c[\udc02-\udfff]"},{name:"Cc",alias:"Control",bmp:"\x00-\u001f\u007f-\u009f"},{name:"Cf",alias:"Format",bmp:"\u00ad\u0600-\u0604\u06dd\u070f\u200b-\u200f\u202a-\u202e\u2060-\u2064\u206a-\u206f\ufeff\ufff9-\ufffb",astral:"\udb40[\udc01\udc20-\udc7f]|\ud834[\udd73-\udd7a]|\ud804\udcbd"},{name:"Cn",alias:"Unassigned",bmp:"\u0378\u0379\u037f-\u0383\u038b\u038d\u03a2\u0528-\u0530\u0557\u0558\u0560\u0588\u058b-\u058e\u0590\u05c8-\u05cf\u05eb-\u05ef\u05f5-\u05ff\u0605\u061c\u061d\u070e\u074b\u074c\u07b2-\u07bf\u07fb-\u07ff\u082e\u082f\u083f\u085c\u085d\u085f-\u089f\u08a1\u08ad-\u08e3\u08ff\u0978\u0980\u0984\u098d\u098e\u0991\u0992\u09a9\u09b1\u09b3-\u09b5\u09ba\u09bb\u09c5\u09c6\u09c9\u09ca\u09cf-\u09d6\u09d8-\u09db\u09de\u09e4\u09e5\u09fc-\u0a00\u0a04\u0a0b-\u0a0e\u0a11\u0a12\u0a29\u0a31\u0a34\u0a37\u0a3a\u0a3b\u0a3d\u0a43-\u0a46\u0a49\u0a4a\u0a4e-\u0a50\u0a52-\u0a58\u0a5d\u0a5f-\u0a65\u0a76-\u0a80\u0a84\u0a8e\u0a92\u0aa9\u0ab1\u0ab4\u0aba\u0abb\u0ac6\u0aca\u0ace\u0acf\u0ad1-\u0adf\u0ae4\u0ae5\u0af2-\u0b00\u0b04\u0b0d\u0b0e\u0b11\u0b12\u0b29\u0b31\u0b34\u0b3a\u0b3b\u0b45\u0b46\u0b49\u0b4a\u0b4e-\u0b55\u0b58-\u0b5b\u0b5e\u0b64\u0b65\u0b78-\u0b81\u0b84\u0b8b-\u0b8d\u0b91\u0b96-\u0b98\u0b9b\u0b9d\u0ba0-\u0ba2\u0ba5-\u0ba7\u0bab-\u0bad\u0bba-\u0bbd\u0bc3-\u0bc5\u0bc9\u0bce\u0bcf\u0bd1-\u0bd6\u0bd8-\u0be5\u0bfb-\u0c00\u0c04\u0c0d\u0c11\u0c29\u0c34\u0c3a-\u0c3c\u0c45\u0c49\u0c4e-\u0c54\u0c57\u0c5a-\u0c5f\u0c64\u0c65\u0c70-\u0c77\u0c80\u0c81\u0c84\u0c8d\u0c91\u0ca9\u0cb4\u0cba\u0cbb\u0cc5\u0cc9\u0cce-\u0cd4\u0cd7-\u0cdd\u0cdf\u0ce4\u0ce5\u0cf0\u0cf3-\u0d01\u0d04\u0d0d\u0d11\u0d3b\u0d3c\u0d45\u0d49\u0d4f-\u0d56\u0d58-\u0d5f\u0d64\u0d65\u0d76-\u0d78\u0d80\u0d81\u0d84\u0d97-\u0d99\u0db2\u0dbc\u0dbe\u0dbf\u0dc7-\u0dc9\u0dcb-\u0dce\u0dd5\u0dd7\u0de0-\u0df1\u0df5-\u0e00\u0e3b-\u0e3e\u0e5c-\u0e80\u0e83\u0e85\u0e86\u0e89\u0e8b\u0e8c\u0e8e-\u0e93\u0e98\u0ea0\u0ea4\u0ea6\u0ea8\u0ea9\u0eac\u0eba\u0ebe\u0ebf\u0ec5\u0ec7\u0ece\u0ecf\u0eda\u0edb\u0ee0-\u0eff\u0f48\u0f6d-\u0f70\u0f98\u0fbd\u0fcd\u0fdb-\u0fff\u10c6\u10c8-\u10cc\u10ce\u10cf\u1249\u124e\u124f\u1257\u1259\u125e\u125f\u1289\u128e\u128f\u12b1\u12b6\u12b7\u12bf\u12c1\u12c6\u12c7\u12d7\u1311\u1316\u1317\u135b\u135c\u137d-\u137f\u139a-\u139f\u13f5-\u13ff\u169d-\u169f\u16f1-\u16ff\u170d\u1715-\u171f\u1737-\u173f\u1754-\u175f\u176d\u1771\u1774-\u177f\u17de\u17df\u17ea-\u17ef\u17fa-\u17ff\u180f\u181a-\u181f\u1878-\u187f\u18ab-\u18af\u18f6-\u18ff\u191d-\u191f\u192c-\u192f\u193c-\u193f\u1941-\u1943\u196e\u196f\u1975-\u197f\u19ac-\u19af\u19ca-\u19cf\u19db-\u19dd\u1a1c\u1a1d\u1a5f\u1a7d\u1a7e\u1a8a-\u1a8f\u1a9a-\u1a9f\u1aae-\u1aff\u1b4c-\u1b4f\u1b7d-\u1b7f\u1bf4-\u1bfb\u1c38-\u1c3a\u1c4a-\u1c4c\u1c80-\u1cbf\u1cc8-\u1ccf\u1cf7-\u1cff\u1de7-\u1dfb\u1f16\u1f17\u1f1e\u1f1f\u1f46\u1f47\u1f4e\u1f4f\u1f58\u1f5a\u1f5c\u1f5e\u1f7e\u1f7f\u1fb5\u1fc5\u1fd4\u1fd5\u1fdc\u1ff0\u1ff1\u1ff5\u1fff\u2065-\u2069\u2072\u2073\u208f\u209d-\u209f\u20bb-\u20cf\u20f1-\u20ff\u218a-\u218f\u23f4-\u23ff\u2427-\u243f\u244b-\u245f\u2700\u2b4d-\u2b4f\u2b5a-\u2bff\u2c2f\u2c5f\u2cf4-\u2cf8\u2d26\u2d28-\u2d2c\u2d2e\u2d2f\u2d68-\u2d6e\u2d71-\u2d7e\u2d97-\u2d9f\u2da7\u2daf\u2db7\u2dbf\u2dc7\u2dcf\u2dd7\u2ddf\u2e3c-\u2e7f\u2e9a\u2ef4-\u2eff\u2fd6-\u2fef\u2ffc-\u2fff\u3040\u3097\u3098\u3100-\u3104\u312e-\u3130\u318f\u31bb-\u31bf\u31e4-\u31ef\u321f\u32ff\u4db6-\u4dbf\u9fcd-\u9fff\ua48d-\ua48f\ua4c7-\ua4cf\ua62c-\ua63f\ua698-\ua69e\ua6f8-\ua6ff\ua78f\ua794-\ua79f\ua7ab-\ua7f7\ua82c-\ua82f\ua83a-\ua83f\ua878-\ua87f\ua8c5-\ua8cd\ua8da-\ua8df\ua8fc-\ua8ff\ua954-\ua95e\ua97d-\ua97f\ua9ce\ua9da-\ua9dd\ua9e0-\ua9ff\uaa37-\uaa3f\uaa4e\uaa4f\uaa5a\uaa5b\uaa7c-\uaa7f\uaac3-\uaada\uaaf7-\uab00\uab07\uab08\uab0f\uab10\uab17-\uab1f\uab27\uab2f-\uabbf\uabee\uabef\uabfa-\uabff\ud7a4-\ud7af\ud7c7-\ud7ca\ud7fc-\ud7ff\ufa6e\ufa6f\ufada-\ufaff\ufb07-\ufb12\ufb18-\ufb1c\ufb37\ufb3d\ufb3f\ufb42\ufb45\ufbc2-\ufbd2\ufd40-\ufd4f\ufd90\ufd91\ufdc8-\ufdef\ufdfe\ufdff\ufe1a-\ufe1f\ufe27-\ufe2f\ufe53\ufe67\ufe6c-\ufe6f\ufe75\ufefd\ufefe\uff00\uffbf-\uffc1\uffc8\uffc9\uffd0\uffd1\uffd8\uffd9\uffdd-\uffdf\uffe7\uffef-\ufff8\ufffe\uffff",astral:"\ud808[\udf6f-\udfff]|\udb40[\udc00\udc02-\udc1f\udc80-\udcff\uddf0-\udfff]|\ud834[\udcf6-\udcff\udd27\udd28\uddde-\uddff\ude46-\udeff\udf57-\udf5f\udf72-\udfff]|\ud802[\udc06\udc07\udc09\udc36\udc39-\udc3b\udc3d\udc3e\udc56\udc60-\udcff\udd1c-\udd1e\udd3a-\udd3e\udd40-\udd7f\uddb8-\uddbd\uddc0-\uddff\ude04\ude07-\ude0b\ude14\ude18\ude34-\ude37\ude3b-\ude3e\ude48-\ude4f\ude59-\ude5f\ude80-\udeff\udf36-\udf38\udf56\udf57\udf73-\udf77\udf80-\udfff]|\ud86d[\udf35-\udf3f]|\ud81b[\udc00-\udeff\udf45-\udf4f\udf7f-\udf8e\udfa0-\udfff]|\ud809[\udc63-\udc6f\udc74-\udfff]|\ud800[\udc0c\udc27\udc3b\udc3e\udc4e\udc4f\udc5e-\udc7f\udcfb-\udcff\udd03-\udd06\udd34-\udd36\udd8b-\udd8f\udd9c-\uddcf\uddfe-\ude7f\ude9d-\ude9f\uded1-\udeff\udf1f\udf24-\udf2f\udf4b-\udf7f\udf9e\udfc4-\udfc7\udfd6-\udfff]|\ud869[\uded7-\udeff]|\ud804[\udc4e-\udc51\udc70-\udc7f\udcc2-\udccf\udce9-\udcef\udcfa-\udcff\udd35\udd44-\udd7f\uddc9-\uddcf\uddda-\udfff]|\ud83b[\udc00-\uddff\ude04\ude20\ude23\ude25\ude26\ude28\ude33\ude38\ude3a\ude3c-\ude41\ude43-\ude46\ude48\ude4a\ude4c\ude50\ude53\ude55\ude56\ude58\ude5a\ude5c\ude5e\ude60\ude63\ude65\ude66\ude6b\ude73\ude78\ude7d\ude7f\ude8a\ude9c-\udea0\udea4\udeaa\udebc-\udeef\udef2-\udfff]|[\udbbf\udbff][\udffe\udfff]|\ud87e[\ude1e-\udfff]|\ud803[\udc49-\ude5f\ude7f-\udfff]|\ud80d[\udc2f-\udfff]|[\ud806\ud807\ud80a\ud80b\ud80e-\ud819\ud81c-\ud82b\ud82d-\ud833\ud836-\ud83a\ud83e\ud83f\ud86f-\ud87d\ud87f-\udb3f\udb41-\udb7f][\udc00-\udfff]|\ud83d[\udc3f\udc41\udcf8\udcfd-\udcff\udd3e\udd3f\udd44-\udd4f\udd68-\uddfa\ude41-\ude44\ude50-\ude7f\udec6-\udeff\udf74-\udfff]|\ud86e[\udc1e-\udfff]|\ud83c[\udc2c-\udc2f\udc94-\udc9f\udcaf\udcb0\udcbf\udcc0\udcd0\udce0-\udcff\udd0b-\udd0f\udd2f\udd6c-\udd6f\udd9b-\udde5\ude03-\ude0f\ude3b-\ude3f\ude49-\ude4f\ude52-\udeff\udf21-\udf2f\udf36\udf7d-\udf7f\udf94-\udf9f\udfc5\udfcb-\udfdf\udff1-\udfff]|\ud835[\udc55\udc9d\udca0\udca1\udca3\udca4\udca7\udca8\udcad\udcba\udcbc\udcc4\udd06\udd0b\udd0c\udd15\udd1d\udd3a\udd3f\udd45\udd47-\udd49\udd51\udea6\udea7\udfcc\udfcd]|\ud81a[\ude39-\udfff]|\ud801[\udc9e\udc9f\udcaa-\udfff]|\ud805[\udc00-\ude7f\udeb8-\udebf\udeca-\udfff]|\ud82c[\udc02-\udfff]"},{name:"Co",alias:"Private_Use",bmp:"\ue000-\uf8ff",astral:"[\udb80-\udbbe\udbc0-\udbfe][\udc00-\udfff]|[\udbbf\udbff][\udc00-\udffd]"},{name:"Cs",alias:"Surrogate",bmp:"\ud800-\udfff"},{name:"Ll",alias:"Lowercase_Letter",bmp:"a-z\u00b5\u00df-\u00f6\u00f8-\u00ff\u0101\u0103\u0105\u0107\u0109\u010b\u010d\u010f\u0111\u0113\u0115\u0117\u0119\u011b\u011d\u011f\u0121\u0123\u0125\u0127\u0129\u012b\u012d\u012f\u0131\u0133\u0135\u0137\u0138\u013a\u013c\u013e\u0140\u0142\u0144\u0146\u0148\u0149\u014b\u014d\u014f\u0151\u0153\u0155\u0157\u0159\u015b\u015d\u015f\u0161\u0163\u0165\u0167\u0169\u016b\u016d\u016f\u0171\u0173\u0175\u0177\u017a\u017c\u017e-\u0180\u0183\u0185\u0188\u018c\u018d\u0192\u0195\u0199-\u019b\u019e\u01a1\u01a3\u01a5\u01a8\u01aa\u01ab\u01ad\u01b0\u01b4\u01b6\u01b9\u01ba\u01bd-\u01bf\u01c6\u01c9\u01cc\u01ce\u01d0\u01d2\u01d4\u01d6\u01d8\u01da\u01dc\u01dd\u01df\u01e1\u01e3\u01e5\u01e7\u01e9\u01eb\u01ed\u01ef\u01f0\u01f3\u01f5\u01f9\u01fb\u01fd\u01ff\u0201\u0203\u0205\u0207\u0209\u020b\u020d\u020f\u0211\u0213\u0215\u0217\u0219\u021b\u021d\u021f\u0221\u0223\u0225\u0227\u0229\u022b\u022d\u022f\u0231\u0233-\u0239\u023c\u023f\u0240\u0242\u0247\u0249\u024b\u024d\u024f-\u0293\u0295-\u02af\u0371\u0373\u0377\u037b-\u037d\u0390\u03ac-\u03ce\u03d0\u03d1\u03d5-\u03d7\u03d9\u03db\u03dd\u03df\u03e1\u03e3\u03e5\u03e7\u03e9\u03eb\u03ed\u03ef-\u03f3\u03f5\u03f8\u03fb\u03fc\u0430-\u045f\u0461\u0463\u0465\u0467\u0469\u046b\u046d\u046f\u0471\u0473\u0475\u0477\u0479\u047b\u047d\u047f\u0481\u048b\u048d\u048f\u0491\u0493\u0495\u0497\u0499\u049b\u049d\u049f\u04a1\u04a3\u04a5\u04a7\u04a9\u04ab\u04ad\u04af\u04b1\u04b3\u04b5\u04b7\u04b9\u04bb\u04bd\u04bf\u04c2\u04c4\u04c6\u04c8\u04ca\u04cc\u04ce\u04cf\u04d1\u04d3\u04d5\u04d7\u04d9\u04db\u04dd\u04df\u04e1\u04e3\u04e5\u04e7\u04e9\u04eb\u04ed\u04ef\u04f1\u04f3\u04f5\u04f7\u04f9\u04fb\u04fd\u04ff\u0501\u0503\u0505\u0507\u0509\u050b\u050d\u050f\u0511\u0513\u0515\u0517\u0519\u051b\u051d\u051f\u0521\u0523\u0525\u0527\u0561-\u0587\u1d00-\u1d2b\u1d6b-\u1d77\u1d79-\u1d9a\u1e01\u1e03\u1e05\u1e07\u1e09\u1e0b\u1e0d\u1e0f\u1e11\u1e13\u1e15\u1e17\u1e19\u1e1b\u1e1d\u1e1f\u1e21\u1e23\u1e25\u1e27\u1e29\u1e2b\u1e2d\u1e2f\u1e31\u1e33\u1e35\u1e37\u1e39\u1e3b\u1e3d\u1e3f\u1e41\u1e43\u1e45\u1e47\u1e49\u1e4b\u1e4d\u1e4f\u1e51\u1e53\u1e55\u1e57\u1e59\u1e5b\u1e5d\u1e5f\u1e61\u1e63\u1e65\u1e67\u1e69\u1e6b\u1e6d\u1e6f\u1e71\u1e73\u1e75\u1e77\u1e79\u1e7b\u1e7d\u1e7f\u1e81\u1e83\u1e85\u1e87\u1e89\u1e8b\u1e8d\u1e8f\u1e91\u1e93\u1e95-\u1e9d\u1e9f\u1ea1\u1ea3\u1ea5\u1ea7\u1ea9\u1eab\u1ead\u1eaf\u1eb1\u1eb3\u1eb5\u1eb7\u1eb9\u1ebb\u1ebd\u1ebf\u1ec1\u1ec3\u1ec5\u1ec7\u1ec9\u1ecb\u1ecd\u1ecf\u1ed1\u1ed3\u1ed5\u1ed7\u1ed9\u1edb\u1edd\u1edf\u1ee1\u1ee3\u1ee5\u1ee7\u1ee9\u1eeb\u1eed\u1eef\u1ef1\u1ef3\u1ef5\u1ef7\u1ef9\u1efb\u1efd\u1eff-\u1f07\u1f10-\u1f15\u1f20-\u1f27\u1f30-\u1f37\u1f40-\u1f45\u1f50-\u1f57\u1f60-\u1f67\u1f70-\u1f7d\u1f80-\u1f87\u1f90-\u1f97\u1fa0-\u1fa7\u1fb0-\u1fb4\u1fb6\u1fb7\u1fbe\u1fc2-\u1fc4\u1fc6\u1fc7\u1fd0-\u1fd3\u1fd6\u1fd7\u1fe0-\u1fe7\u1ff2-\u1ff4\u1ff6\u1ff7\u210a\u210e\u210f\u2113\u212f\u2134\u2139\u213c\u213d\u2146-\u2149\u214e\u2184\u2c30-\u2c5e\u2c61\u2c65\u2c66\u2c68\u2c6a\u2c6c\u2c71\u2c73\u2c74\u2c76-\u2c7b\u2c81\u2c83\u2c85\u2c87\u2c89\u2c8b\u2c8d\u2c8f\u2c91\u2c93\u2c95\u2c97\u2c99\u2c9b\u2c9d\u2c9f\u2ca1\u2ca3\u2ca5\u2ca7\u2ca9\u2cab\u2cad\u2caf\u2cb1\u2cb3\u2cb5\u2cb7\u2cb9\u2cbb\u2cbd\u2cbf\u2cc1\u2cc3\u2cc5\u2cc7\u2cc9\u2ccb\u2ccd\u2ccf\u2cd1\u2cd3\u2cd5\u2cd7\u2cd9\u2cdb\u2cdd\u2cdf\u2ce1\u2ce3\u2ce4\u2cec\u2cee\u2cf3\u2d00-\u2d25\u2d27\u2d2d\ua641\ua643\ua645\ua647\ua649\ua64b\ua64d\ua64f\ua651\ua653\ua655\ua657\ua659\ua65b\ua65d\ua65f\ua661\ua663\ua665\ua667\ua669\ua66b\ua66d\ua681\ua683\ua685\ua687\ua689\ua68b\ua68d\ua68f\ua691\ua693\ua695\ua697\ua723\ua725\ua727\ua729\ua72b\ua72d\ua72f-\ua731\ua733\ua735\ua737\ua739\ua73b\ua73d\ua73f\ua741\ua743\ua745\ua747\ua749\ua74b\ua74d\ua74f\ua751\ua753\ua755\ua757\ua759\ua75b\ua75d\ua75f\ua761\ua763\ua765\ua767\ua769\ua76b\ua76d\ua76f\ua771-\ua778\ua77a\ua77c\ua77f\ua781\ua783\ua785\ua787\ua78c\ua78e\ua791\ua793\ua7a1\ua7a3\ua7a5\ua7a7\ua7a9\ua7fa\ufb00-\ufb06\ufb13-\ufb17\uff41-\uff5a",astral:"\ud835[\udc1a-\udc33\udc4e-\udc54\udc56-\udc67\udc82-\udc9b\udcb6-\udcb9\udcbb\udcbd-\udcc3\udcc5-\udccf\udcea-\udd03\udd1e-\udd37\udd52-\udd6b\udd86-\udd9f\uddba-\uddd3\uddee-\ude07\ude22-\ude3b\ude56-\ude6f\ude8a-\udea5\udec2-\udeda\udedc-\udee1\udefc-\udf14\udf16-\udf1b\udf36-\udf4e\udf50-\udf55\udf70-\udf88\udf8a-\udf8f\udfaa-\udfc2\udfc4-\udfc9\udfcb]|\ud801[\udc28-\udc4f]"},{name:"Lm",alias:"Modifier_Letter",bmp:"\u02b0-\u02c1\u02c6-\u02d1\u02e0-\u02e4\u02ec\u02ee\u0374\u037a\u0559\u0640\u06e5\u06e6\u07f4\u07f5\u07fa\u081a\u0824\u0828\u0971\u0e46\u0ec6\u10fc\u17d7\u1843\u1aa7\u1c78-\u1c7d\u1d2c-\u1d6a\u1d78\u1d9b-\u1dbf\u2071\u207f\u2090-\u209c\u2c7c\u2c7d\u2d6f\u2e2f\u3005\u3031-\u3035\u303b\u309d\u309e\u30fc-\u30fe\ua015\ua4f8-\ua4fd\ua60c\ua67f\ua717-\ua71f\ua770\ua788\ua7f8\ua7f9\ua9cf\uaa70\uaadd\uaaf3\uaaf4\uff70\uff9e\uff9f",astral:"\ud81b[\udf93-\udf9f]"},{name:"Lo",alias:"Other_Letter",bmp:"\u00aa\u00ba\u01bb\u01c0-\u01c3\u0294\u05d0-\u05ea\u05f0-\u05f2\u0620-\u063f\u0641-\u064a\u066e\u066f\u0671-\u06d3\u06d5\u06ee\u06ef\u06fa-\u06fc\u06ff\u0710\u0712-\u072f\u074d-\u07a5\u07b1\u07ca-\u07ea\u0800-\u0815\u0840-\u0858\u08a0\u08a2-\u08ac\u0904-\u0939\u093d\u0950\u0958-\u0961\u0972-\u0977\u0979-\u097f\u0985-\u098c\u098f\u0990\u0993-\u09a8\u09aa-\u09b0\u09b2\u09b6-\u09b9\u09bd\u09ce\u09dc\u09dd\u09df-\u09e1\u09f0\u09f1\u0a05-\u0a0a\u0a0f\u0a10\u0a13-\u0a28\u0a2a-\u0a30\u0a32\u0a33\u0a35\u0a36\u0a38\u0a39\u0a59-\u0a5c\u0a5e\u0a72-\u0a74\u0a85-\u0a8d\u0a8f-\u0a91\u0a93-\u0aa8\u0aaa-\u0ab0\u0ab2\u0ab3\u0ab5-\u0ab9\u0abd\u0ad0\u0ae0\u0ae1\u0b05-\u0b0c\u0b0f\u0b10\u0b13-\u0b28\u0b2a-\u0b30\u0b32\u0b33\u0b35-\u0b39\u0b3d\u0b5c\u0b5d\u0b5f-\u0b61\u0b71\u0b83\u0b85-\u0b8a\u0b8e-\u0b90\u0b92-\u0b95\u0b99\u0b9a\u0b9c\u0b9e\u0b9f\u0ba3\u0ba4\u0ba8-\u0baa\u0bae-\u0bb9\u0bd0\u0c05-\u0c0c\u0c0e-\u0c10\u0c12-\u0c28\u0c2a-\u0c33\u0c35-\u0c39\u0c3d\u0c58\u0c59\u0c60\u0c61\u0c85-\u0c8c\u0c8e-\u0c90\u0c92-\u0ca8\u0caa-\u0cb3\u0cb5-\u0cb9\u0cbd\u0cde\u0ce0\u0ce1\u0cf1\u0cf2\u0d05-\u0d0c\u0d0e-\u0d10\u0d12-\u0d3a\u0d3d\u0d4e\u0d60\u0d61\u0d7a-\u0d7f\u0d85-\u0d96\u0d9a-\u0db1\u0db3-\u0dbb\u0dbd\u0dc0-\u0dc6\u0e01-\u0e30\u0e32\u0e33\u0e40-\u0e45\u0e81\u0e82\u0e84\u0e87\u0e88\u0e8a\u0e8d\u0e94-\u0e97\u0e99-\u0e9f\u0ea1-\u0ea3\u0ea5\u0ea7\u0eaa\u0eab\u0ead-\u0eb0\u0eb2\u0eb3\u0ebd\u0ec0-\u0ec4\u0edc-\u0edf\u0f00\u0f40-\u0f47\u0f49-\u0f6c\u0f88-\u0f8c\u1000-\u102a\u103f\u1050-\u1055\u105a-\u105d\u1061\u1065\u1066\u106e-\u1070\u1075-\u1081\u108e\u10d0-\u10fa\u10fd-\u1248\u124a-\u124d\u1250-\u1256\u1258\u125a-\u125d\u1260-\u1288\u128a-\u128d\u1290-\u12b0\u12b2-\u12b5\u12b8-\u12be\u12c0\u12c2-\u12c5\u12c8-\u12d6\u12d8-\u1310\u1312-\u1315\u1318-\u135a\u1380-\u138f\u13a0-\u13f4\u1401-\u166c\u166f-\u167f\u1681-\u169a\u16a0-\u16ea\u1700-\u170c\u170e-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176c\u176e-\u1770\u1780-\u17b3\u17dc\u1820-\u1842\u1844-\u1877\u1880-\u18a8\u18aa\u18b0-\u18f5\u1900-\u191c\u1950-\u196d\u1970-\u1974\u1980-\u19ab\u19c1-\u19c7\u1a00-\u1a16\u1a20-\u1a54\u1b05-\u1b33\u1b45-\u1b4b\u1b83-\u1ba0\u1bae\u1baf\u1bba-\u1be5\u1c00-\u1c23\u1c4d-\u1c4f\u1c5a-\u1c77\u1ce9-\u1cec\u1cee-\u1cf1\u1cf5\u1cf6\u2135-\u2138\u2d30-\u2d67\u2d80-\u2d96\u2da0-\u2da6\u2da8-\u2dae\u2db0-\u2db6\u2db8-\u2dbe\u2dc0-\u2dc6\u2dc8-\u2dce\u2dd0-\u2dd6\u2dd8-\u2dde\u3006\u303c\u3041-\u3096\u309f\u30a1-\u30fa\u30ff\u3105-\u312d\u3131-\u318e\u31a0-\u31ba\u31f0-\u31ff\u3400-\u4db5\u4e00-\u9fcc\ua000-\ua014\ua016-\ua48c\ua4d0-\ua4f7\ua500-\ua60b\ua610-\ua61f\ua62a\ua62b\ua66e\ua6a0-\ua6e5\ua7fb-\ua801\ua803-\ua805\ua807-\ua80a\ua80c-\ua822\ua840-\ua873\ua882-\ua8b3\ua8f2-\ua8f7\ua8fb\ua90a-\ua925\ua930-\ua946\ua960-\ua97c\ua984-\ua9b2\uaa00-\uaa28\uaa40-\uaa42\uaa44-\uaa4b\uaa60-\uaa6f\uaa71-\uaa76\uaa7a\uaa80-\uaaaf\uaab1\uaab5\uaab6\uaab9-\uaabd\uaac0\uaac2\uaadb\uaadc\uaae0-\uaaea\uaaf2\uab01-\uab06\uab09-\uab0e\uab11-\uab16\uab20-\uab26\uab28-\uab2e\uabc0-\uabe2\uac00-\ud7a3\ud7b0-\ud7c6\ud7cb-\ud7fb\uf900-\ufa6d\ufa70-\ufad9\ufb1d\ufb1f-\ufb28\ufb2a-\ufb36\ufb38-\ufb3c\ufb3e\ufb40\ufb41\ufb43\ufb44\ufb46-\ufbb1\ufbd3-\ufd3d\ufd50-\ufd8f\ufd92-\ufdc7\ufdf0-\ufdfb\ufe70-\ufe74\ufe76-\ufefc\uff66-\uff6f\uff71-\uff9d\uffa0-\uffbe\uffc2-\uffc7\uffca-\uffcf\uffd2-\uffd7\uffda-\uffdc",astral:"\ud802[\udc00-\udc05\udc08\udc0a-\udc35\udc37\udc38\udc3c\udc3f-\udc55\udd00-\udd15\udd20-\udd39\udd80-\uddb7\uddbe\uddbf\ude00\ude10-\ude13\ude15-\ude17\ude19-\ude33\ude60-\ude7c\udf00-\udf35\udf40-\udf55\udf60-\udf72]|\ud800[\udc00-\udc0b\udc0d-\udc26\udc28-\udc3a\udc3c\udc3d\udc3f-\udc4d\udc50-\udc5d\udc80-\udcfa\ude80-\ude9c\udea0-\uded0\udf00-\udf1e\udf30-\udf40\udf42-\udf49\udf80-\udf9d\udfa0-\udfc3\udfc8-\udfcf]|\ud81a[\udc00-\ude38]|\ud804[\udc03-\udc37\udc83-\udcaf\udcd0-\udce8\udd03-\udd26\udd83-\uddb2\uddc1-\uddc4]|\ud86e[\udc00-\udc1d]|\ud86d[\udc00-\udf34\udf40-\udfff]|\ud803[\udc00-\udc48]|\ud80d[\udc00-\udc2e]|\ud805[\ude80-\udeaa]|\ud87e[\udc00-\ude1d]|\ud81b[\udf00-\udf44\udf50]|\ud801[\udc50-\udc9d]|\ud82c[\udc00\udc01]|[\ud80c\ud840-\ud868\ud86a-\ud86c][\udc00-\udfff]|\ud83b[\ude00-\ude03\ude05-\ude1f\ude21\ude22\ude24\ude27\ude29-\ude32\ude34-\ude37\ude39\ude3b\ude42\ude47\ude49\ude4b\ude4d-\ude4f\ude51\ude52\ude54\ude57\ude59\ude5b\ude5d\ude5f\ude61\ude62\ude64\ude67-\ude6a\ude6c-\ude72\ude74-\ude77\ude79-\ude7c\ude7e\ude80-\ude89\ude8b-\ude9b\udea1-\udea3\udea5-\udea9\udeab-\udebb]|\ud808[\udc00-\udf6e]|\ud869[\udc00-\uded6\udf00-\udfff]"},{name:"Lt",alias:"Titlecase_Letter",bmp:"\u01c5\u01c8\u01cb\u01f2\u1f88-\u1f8f\u1f98-\u1f9f\u1fa8-\u1faf\u1fbc\u1fcc\u1ffc"},{name:"Lu",alias:"Uppercase_Letter",bmp:"A-Z\u00c0-\u00d6\u00d8-\u00de\u0100\u0102\u0104\u0106\u0108\u010a\u010c\u010e\u0110\u0112\u0114\u0116\u0118\u011a\u011c\u011e\u0120\u0122\u0124\u0126\u0128\u012a\u012c\u012e\u0130\u0132\u0134\u0136\u0139\u013b\u013d\u013f\u0141\u0143\u0145\u0147\u014a\u014c\u014e\u0150\u0152\u0154\u0156\u0158\u015a\u015c\u015e\u0160\u0162\u0164\u0166\u0168\u016a\u016c\u016e\u0170\u0172\u0174\u0176\u0178\u0179\u017b\u017d\u0181\u0182\u0184\u0186\u0187\u0189-\u018b\u018e-\u0191\u0193\u0194\u0196-\u0198\u019c\u019d\u019f\u01a0\u01a2\u01a4\u01a6\u01a7\u01a9\u01ac\u01ae\u01af\u01b1-\u01b3\u01b5\u01b7\u01b8\u01bc\u01c4\u01c7\u01ca\u01cd\u01cf\u01d1\u01d3\u01d5\u01d7\u01d9\u01db\u01de\u01e0\u01e2\u01e4\u01e6\u01e8\u01ea\u01ec\u01ee\u01f1\u01f4\u01f6-\u01f8\u01fa\u01fc\u01fe\u0200\u0202\u0204\u0206\u0208\u020a\u020c\u020e\u0210\u0212\u0214\u0216\u0218\u021a\u021c\u021e\u0220\u0222\u0224\u0226\u0228\u022a\u022c\u022e\u0230\u0232\u023a\u023b\u023d\u023e\u0241\u0243-\u0246\u0248\u024a\u024c\u024e\u0370\u0372\u0376\u0386\u0388-\u038a\u038c\u038e\u038f\u0391-\u03a1\u03a3-\u03ab\u03cf\u03d2-\u03d4\u03d8\u03da\u03dc\u03de\u03e0\u03e2\u03e4\u03e6\u03e8\u03ea\u03ec\u03ee\u03f4\u03f7\u03f9\u03fa\u03fd-\u042f\u0460\u0462\u0464\u0466\u0468\u046a\u046c\u046e\u0470\u0472\u0474\u0476\u0478\u047a\u047c\u047e\u0480\u048a\u048c\u048e\u0490\u0492\u0494\u0496\u0498\u049a\u049c\u049e\u04a0\u04a2\u04a4\u04a6\u04a8\u04aa\u04ac\u04ae\u04b0\u04b2\u04b4\u04b6\u04b8\u04ba\u04bc\u04be\u04c0\u04c1\u04c3\u04c5\u04c7\u04c9\u04cb\u04cd\u04d0\u04d2\u04d4\u04d6\u04d8\u04da\u04dc\u04de\u04e0\u04e2\u04e4\u04e6\u04e8\u04ea\u04ec\u04ee\u04f0\u04f2\u04f4\u04f6\u04f8\u04fa\u04fc\u04fe\u0500\u0502\u0504\u0506\u0508\u050a\u050c\u050e\u0510\u0512\u0514\u0516\u0518\u051a\u051c\u051e\u0520\u0522\u0524\u0526\u0531-\u0556\u10a0-\u10c5\u10c7\u10cd\u1e00\u1e02\u1e04\u1e06\u1e08\u1e0a\u1e0c\u1e0e\u1e10\u1e12\u1e14\u1e16\u1e18\u1e1a\u1e1c\u1e1e\u1e20\u1e22\u1e24\u1e26\u1e28\u1e2a\u1e2c\u1e2e\u1e30\u1e32\u1e34\u1e36\u1e38\u1e3a\u1e3c\u1e3e\u1e40\u1e42\u1e44\u1e46\u1e48\u1e4a\u1e4c\u1e4e\u1e50\u1e52\u1e54\u1e56\u1e58\u1e5a\u1e5c\u1e5e\u1e60\u1e62\u1e64\u1e66\u1e68\u1e6a\u1e6c\u1e6e\u1e70\u1e72\u1e74\u1e76\u1e78\u1e7a\u1e7c\u1e7e\u1e80\u1e82\u1e84\u1e86\u1e88\u1e8a\u1e8c\u1e8e\u1e90\u1e92\u1e94\u1e9e\u1ea0\u1ea2\u1ea4\u1ea6\u1ea8\u1eaa\u1eac\u1eae\u1eb0\u1eb2\u1eb4\u1eb6\u1eb8\u1eba\u1ebc\u1ebe\u1ec0\u1ec2\u1ec4\u1ec6\u1ec8\u1eca\u1ecc\u1ece\u1ed0\u1ed2\u1ed4\u1ed6\u1ed8\u1eda\u1edc\u1ede\u1ee0\u1ee2\u1ee4\u1ee6\u1ee8\u1eea\u1eec\u1eee\u1ef0\u1ef2\u1ef4\u1ef6\u1ef8\u1efa\u1efc\u1efe\u1f08-\u1f0f\u1f18-\u1f1d\u1f28-\u1f2f\u1f38-\u1f3f\u1f48-\u1f4d\u1f59\u1f5b\u1f5d\u1f5f\u1f68-\u1f6f\u1fb8-\u1fbb\u1fc8-\u1fcb\u1fd8-\u1fdb\u1fe8-\u1fec\u1ff8-\u1ffb\u2102\u2107\u210b-\u210d\u2110-\u2112\u2115\u2119-\u211d\u2124\u2126\u2128\u212a-\u212d\u2130-\u2133\u213e\u213f\u2145\u2183\u2c00-\u2c2e\u2c60\u2c62-\u2c64\u2c67\u2c69\u2c6b\u2c6d-\u2c70\u2c72\u2c75\u2c7e-\u2c80\u2c82\u2c84\u2c86\u2c88\u2c8a\u2c8c\u2c8e\u2c90\u2c92\u2c94\u2c96\u2c98\u2c9a\u2c9c\u2c9e\u2ca0\u2ca2\u2ca4\u2ca6\u2ca8\u2caa\u2cac\u2cae\u2cb0\u2cb2\u2cb4\u2cb6\u2cb8\u2cba\u2cbc\u2cbe\u2cc0\u2cc2\u2cc4\u2cc6\u2cc8\u2cca\u2ccc\u2cce\u2cd0\u2cd2\u2cd4\u2cd6\u2cd8\u2cda\u2cdc\u2cde\u2ce0\u2ce2\u2ceb\u2ced\u2cf2\ua640\ua642\ua644\ua646\ua648\ua64a\ua64c\ua64e\ua650\ua652\ua654\ua656\ua658\ua65a\ua65c\ua65e\ua660\ua662\ua664\ua666\ua668\ua66a\ua66c\ua680\ua682\ua684\ua686\ua688\ua68a\ua68c\ua68e\ua690\ua692\ua694\ua696\ua722\ua724\ua726\ua728\ua72a\ua72c\ua72e\ua732\ua734\ua736\ua738\ua73a\ua73c\ua73e\ua740\ua742\ua744\ua746\ua748\ua74a\ua74c\ua74e\ua750\ua752\ua754\ua756\ua758\ua75a\ua75c\ua75e\ua760\ua762\ua764\ua766\ua768\ua76a\ua76c\ua76e\ua779\ua77b\ua77d\ua77e\ua780\ua782\ua784\ua786\ua78b\ua78d\ua790\ua792\ua7a0\ua7a2\ua7a4\ua7a6\ua7a8\ua7aa\uff21-\uff3a",astral:"\ud835[\udc00-\udc19\udc34-\udc4d\udc68-\udc81\udc9c\udc9e\udc9f\udca2\udca5\udca6\udca9-\udcac\udcae-\udcb5\udcd0-\udce9\udd04\udd05\udd07-\udd0a\udd0d-\udd14\udd16-\udd1c\udd38\udd39\udd3b-\udd3e\udd40-\udd44\udd46\udd4a-\udd50\udd6c-\udd85\udda0-\uddb9\uddd4-\udded\ude08-\ude21\ude3c-\ude55\ude70-\ude89\udea8-\udec0\udee2-\udefa\udf1c-\udf34\udf56-\udf6e\udf90-\udfa8\udfca]|\ud801[\udc00-\udc27]"},{name:"M",alias:"Mark",bmp:"\u0300-\u036f\u0483-\u0489\u0591-\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u0610-\u061a\u064b-\u065f\u0670\u06d6-\u06dc\u06df-\u06e4\u06e7\u06e8\u06ea-\u06ed\u0711\u0730-\u074a\u07a6-\u07b0\u07eb-\u07f3\u0816-\u0819\u081b-\u0823\u0825-\u0827\u0829-\u082d\u0859-\u085b\u08e4-\u08fe\u0900-\u0903\u093a-\u093c\u093e-\u094f\u0951-\u0957\u0962\u0963\u0981-\u0983\u09bc\u09be-\u09c4\u09c7\u09c8\u09cb-\u09cd\u09d7\u09e2\u09e3\u0a01-\u0a03\u0a3c\u0a3e-\u0a42\u0a47\u0a48\u0a4b-\u0a4d\u0a51\u0a70\u0a71\u0a75\u0a81-\u0a83\u0abc\u0abe-\u0ac5\u0ac7-\u0ac9\u0acb-\u0acd\u0ae2\u0ae3\u0b01-\u0b03\u0b3c\u0b3e-\u0b44\u0b47\u0b48\u0b4b-\u0b4d\u0b56\u0b57\u0b62\u0b63\u0b82\u0bbe-\u0bc2\u0bc6-\u0bc8\u0bca-\u0bcd\u0bd7\u0c01-\u0c03\u0c3e-\u0c44\u0c46-\u0c48\u0c4a-\u0c4d\u0c55\u0c56\u0c62\u0c63\u0c82\u0c83\u0cbc\u0cbe-\u0cc4\u0cc6-\u0cc8\u0cca-\u0ccd\u0cd5\u0cd6\u0ce2\u0ce3\u0d02\u0d03\u0d3e-\u0d44\u0d46-\u0d48\u0d4a-\u0d4d\u0d57\u0d62\u0d63\u0d82\u0d83\u0dca\u0dcf-\u0dd4\u0dd6\u0dd8-\u0ddf\u0df2\u0df3\u0e31\u0e34-\u0e3a\u0e47-\u0e4e\u0eb1\u0eb4-\u0eb9\u0ebb\u0ebc\u0ec8-\u0ecd\u0f18\u0f19\u0f35\u0f37\u0f39\u0f3e\u0f3f\u0f71-\u0f84\u0f86\u0f87\u0f8d-\u0f97\u0f99-\u0fbc\u0fc6\u102b-\u103e\u1056-\u1059\u105e-\u1060\u1062-\u1064\u1067-\u106d\u1071-\u1074\u1082-\u108d\u108f\u109a-\u109d\u135d-\u135f\u1712-\u1714\u1732-\u1734\u1752\u1753\u1772\u1773\u17b4-\u17d3\u17dd\u180b-\u180d\u18a9\u1920-\u192b\u1930-\u193b\u19b0-\u19c0\u19c8\u19c9\u1a17-\u1a1b\u1a55-\u1a5e\u1a60-\u1a7c\u1a7f\u1b00-\u1b04\u1b34-\u1b44\u1b6b-\u1b73\u1b80-\u1b82\u1ba1-\u1bad\u1be6-\u1bf3\u1c24-\u1c37\u1cd0-\u1cd2\u1cd4-\u1ce8\u1ced\u1cf2-\u1cf4\u1dc0-\u1de6\u1dfc-\u1dff\u20d0-\u20f0\u2cef-\u2cf1\u2d7f\u2de0-\u2dff\u302a-\u302f\u3099\u309a\ua66f-\ua672\ua674-\ua67d\ua69f\ua6f0\ua6f1\ua802\ua806\ua80b\ua823-\ua827\ua880\ua881\ua8b4-\ua8c4\ua8e0-\ua8f1\ua926-\ua92d\ua947-\ua953\ua980-\ua983\ua9b3-\ua9c0\uaa29-\uaa36\uaa43\uaa4c\uaa4d\uaa7b\uaab0\uaab2-\uaab4\uaab7\uaab8\uaabe\uaabf\uaac1\uaaeb-\uaaef\uaaf5\uaaf6\uabe3-\uabea\uabec\uabed\ufb1e\ufe00-\ufe0f\ufe20-\ufe26",astral:"\ud834[\udd65-\udd69\udd6d-\udd72\udd7b-\udd82\udd85-\udd8b\uddaa-\uddad\ude42-\ude44]|\ud802[\ude01-\ude03\ude05\ude06\ude0c-\ude0f\ude38-\ude3a\ude3f]|\ud81b[\udf51-\udf7e\udf8f-\udf92]|\ud804[\udc00-\udc02\udc38-\udc46\udc80-\udc82\udcb0-\udcba\udd00-\udd02\udd27-\udd34\udd80-\udd82\uddb3-\uddc0]|\ud805[\udeab-\udeb7]|\ud800\uddfd|\udb40[\udd00-\uddef]"},{name:"Mc",alias:"Spacing_Mark",bmp:"\u0903\u093b\u093e-\u0940\u0949-\u094c\u094e\u094f\u0982\u0983\u09be-\u09c0\u09c7\u09c8\u09cb\u09cc\u09d7\u0a03\u0a3e-\u0a40\u0a83\u0abe-\u0ac0\u0ac9\u0acb\u0acc\u0b02\u0b03\u0b3e\u0b40\u0b47\u0b48\u0b4b\u0b4c\u0b57\u0bbe\u0bbf\u0bc1\u0bc2\u0bc6-\u0bc8\u0bca-\u0bcc\u0bd7\u0c01-\u0c03\u0c41-\u0c44\u0c82\u0c83\u0cbe\u0cc0-\u0cc4\u0cc7\u0cc8\u0cca\u0ccb\u0cd5\u0cd6\u0d02\u0d03\u0d3e-\u0d40\u0d46-\u0d48\u0d4a-\u0d4c\u0d57\u0d82\u0d83\u0dcf-\u0dd1\u0dd8-\u0ddf\u0df2\u0df3\u0f3e\u0f3f\u0f7f\u102b\u102c\u1031\u1038\u103b\u103c\u1056\u1057\u1062-\u1064\u1067-\u106d\u1083\u1084\u1087-\u108c\u108f\u109a-\u109c\u17b6\u17be-\u17c5\u17c7\u17c8\u1923-\u1926\u1929-\u192b\u1930\u1931\u1933-\u1938\u19b0-\u19c0\u19c8\u19c9\u1a19-\u1a1b\u1a55\u1a57\u1a61\u1a63\u1a64\u1a6d-\u1a72\u1b04\u1b35\u1b3b\u1b3d-\u1b41\u1b43\u1b44\u1b82\u1ba1\u1ba6\u1ba7\u1baa\u1bac\u1bad\u1be7\u1bea-\u1bec\u1bee\u1bf2\u1bf3\u1c24-\u1c2b\u1c34\u1c35\u1ce1\u1cf2\u1cf3\u302e\u302f\ua823\ua824\ua827\ua880\ua881\ua8b4-\ua8c3\ua952\ua953\ua983\ua9b4\ua9b5\ua9ba\ua9bb\ua9bd-\ua9c0\uaa2f\uaa30\uaa33\uaa34\uaa4d\uaa7b\uaaeb\uaaee\uaaef\uaaf5\uabe3\uabe4\uabe6\uabe7\uabe9\uabea\uabec",astral:"\ud834[\udd65\udd66\udd6d-\udd72]|\ud804[\udc00\udc02\udc82\udcb0-\udcb2\udcb7\udcb8\udd2c\udd82\uddb3-\uddb5\uddbf\uddc0]|\ud805[\udeac\udeae\udeaf\udeb6]|\ud81b[\udf51-\udf7e]"},{name:"Me",alias:"Enclosing_Mark",bmp:"\u0488\u0489\u20dd-\u20e0\u20e2-\u20e4\ua670-\ua672"},{name:"Mn",alias:"Nonspacing_Mark",bmp:"\u0300-\u036f\u0483-\u0487\u0591-\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u0610-\u061a\u064b-\u065f\u0670\u06d6-\u06dc\u06df-\u06e4\u06e7\u06e8\u06ea-\u06ed\u0711\u0730-\u074a\u07a6-\u07b0\u07eb-\u07f3\u0816-\u0819\u081b-\u0823\u0825-\u0827\u0829-\u082d\u0859-\u085b\u08e4-\u08fe\u0900-\u0902\u093a\u093c\u0941-\u0948\u094d\u0951-\u0957\u0962\u0963\u0981\u09bc\u09c1-\u09c4\u09cd\u09e2\u09e3\u0a01\u0a02\u0a3c\u0a41\u0a42\u0a47\u0a48\u0a4b-\u0a4d\u0a51\u0a70\u0a71\u0a75\u0a81\u0a82\u0abc\u0ac1-\u0ac5\u0ac7\u0ac8\u0acd\u0ae2\u0ae3\u0b01\u0b3c\u0b3f\u0b41-\u0b44\u0b4d\u0b56\u0b62\u0b63\u0b82\u0bc0\u0bcd\u0c3e-\u0c40\u0c46-\u0c48\u0c4a-\u0c4d\u0c55\u0c56\u0c62\u0c63\u0cbc\u0cbf\u0cc6\u0ccc\u0ccd\u0ce2\u0ce3\u0d41-\u0d44\u0d4d\u0d62\u0d63\u0dca\u0dd2-\u0dd4\u0dd6\u0e31\u0e34-\u0e3a\u0e47-\u0e4e\u0eb1\u0eb4-\u0eb9\u0ebb\u0ebc\u0ec8-\u0ecd\u0f18\u0f19\u0f35\u0f37\u0f39\u0f71-\u0f7e\u0f80-\u0f84\u0f86\u0f87\u0f8d-\u0f97\u0f99-\u0fbc\u0fc6\u102d-\u1030\u1032-\u1037\u1039\u103a\u103d\u103e\u1058\u1059\u105e-\u1060\u1071-\u1074\u1082\u1085\u1086\u108d\u109d\u135d-\u135f\u1712-\u1714\u1732-\u1734\u1752\u1753\u1772\u1773\u17b4\u17b5\u17b7-\u17bd\u17c6\u17c9-\u17d3\u17dd\u180b-\u180d\u18a9\u1920-\u1922\u1927\u1928\u1932\u1939-\u193b\u1a17\u1a18\u1a56\u1a58-\u1a5e\u1a60\u1a62\u1a65-\u1a6c\u1a73-\u1a7c\u1a7f\u1b00-\u1b03\u1b34\u1b36-\u1b3a\u1b3c\u1b42\u1b6b-\u1b73\u1b80\u1b81\u1ba2-\u1ba5\u1ba8\u1ba9\u1bab\u1be6\u1be8\u1be9\u1bed\u1bef-\u1bf1\u1c2c-\u1c33\u1c36\u1c37\u1cd0-\u1cd2\u1cd4-\u1ce0\u1ce2-\u1ce8\u1ced\u1cf4\u1dc0-\u1de6\u1dfc-\u1dff\u20d0-\u20dc\u20e1\u20e5-\u20f0\u2cef-\u2cf1\u2d7f\u2de0-\u2dff\u302a-\u302d\u3099\u309a\ua66f\ua674-\ua67d\ua69f\ua6f0\ua6f1\ua802\ua806\ua80b\ua825\ua826\ua8c4\ua8e0-\ua8f1\ua926-\ua92d\ua947-\ua951\ua980-\ua982\ua9b3\ua9b6-\ua9b9\ua9bc\uaa29-\uaa2e\uaa31\uaa32\uaa35\uaa36\uaa43\uaa4c\uaab0\uaab2-\uaab4\uaab7\uaab8\uaabe\uaabf\uaac1\uaaec\uaaed\uaaf6\uabe5\uabe8\uabed\ufb1e\ufe00-\ufe0f\ufe20-\ufe26",astral:"\ud802[\ude01-\ude03\ude05\ude06\ude0c-\ude0f\ude38-\ude3a\ude3f]|\ud834[\udd67-\udd69\udd7b-\udd82\udd85-\udd8b\uddaa-\uddad\ude42-\ude44]|\ud81b[\udf8f-\udf92]|\ud805[\udeab\udead\udeb0-\udeb5\udeb7]|\ud804[\udc01\udc38-\udc46\udc80\udc81\udcb3-\udcb6\udcb9\udcba\udd00-\udd02\udd27-\udd2b\udd2d-\udd34\udd80\udd81\uddb6-\uddbe]|\ud800\uddfd|\udb40[\udd00-\uddef]"},{name:"N",alias:"Number",bmp:"0-9\u00b2\u00b3\u00b9\u00bc-\u00be\u0660-\u0669\u06f0-\u06f9\u07c0-\u07c9\u0966-\u096f\u09e6-\u09ef\u09f4-\u09f9\u0a66-\u0a6f\u0ae6-\u0aef\u0b66-\u0b6f\u0b72-\u0b77\u0be6-\u0bf2\u0c66-\u0c6f\u0c78-\u0c7e\u0ce6-\u0cef\u0d66-\u0d75\u0e50-\u0e59\u0ed0-\u0ed9\u0f20-\u0f33\u1040-\u1049\u1090-\u1099\u1369-\u137c\u16ee-\u16f0\u17e0-\u17e9\u17f0-\u17f9\u1810-\u1819\u1946-\u194f\u19d0-\u19da\u1a80-\u1a89\u1a90-\u1a99\u1b50-\u1b59\u1bb0-\u1bb9\u1c40-\u1c49\u1c50-\u1c59\u2070\u2074-\u2079\u2080-\u2089\u2150-\u2182\u2185-\u2189\u2460-\u249b\u24ea-\u24ff\u2776-\u2793\u2cfd\u3007\u3021-\u3029\u3038-\u303a\u3192-\u3195\u3220-\u3229\u3248-\u324f\u3251-\u325f\u3280-\u3289\u32b1-\u32bf\ua620-\ua629\ua6e6-\ua6ef\ua830-\ua835\ua8d0-\ua8d9\ua900-\ua909\ua9d0-\ua9d9\uaa50-\uaa59\uabf0-\uabf9\uff10-\uff19",astral:"\ud802[\udc58-\udc5f\udd16-\udd1b\ude40-\ude47\ude7d\ude7e\udf58-\udf5f\udf78-\udf7f]|\ud801[\udca0-\udca9]|\ud809[\udc00-\udc62]|\ud835[\udfce-\udfff]|\ud800[\udd07-\udd33\udd40-\udd78\udd8a\udf20-\udf23\udf41\udf4a\udfd1-\udfd5]|\ud834[\udf60-\udf71]|\ud803[\ude60-\ude7e]|\ud83c[\udd00-\udd0a]|\ud805[\udec0-\udec9]|\ud804[\udc52-\udc6f\udcf0-\udcf9\udd36-\udd3f\uddd0-\uddd9]"},{name:"Nd",alias:"Decimal_Number",bmp:"0-9\u0660-\u0669\u06f0-\u06f9\u07c0-\u07c9\u0966-\u096f\u09e6-\u09ef\u0a66-\u0a6f\u0ae6-\u0aef\u0b66-\u0b6f\u0be6-\u0bef\u0c66-\u0c6f\u0ce6-\u0cef\u0d66-\u0d6f\u0e50-\u0e59\u0ed0-\u0ed9\u0f20-\u0f29\u1040-\u1049\u1090-\u1099\u17e0-\u17e9\u1810-\u1819\u1946-\u194f\u19d0-\u19d9\u1a80-\u1a89\u1a90-\u1a99\u1b50-\u1b59\u1bb0-\u1bb9\u1c40-\u1c49\u1c50-\u1c59\ua620-\ua629\ua8d0-\ua8d9\ua900-\ua909\ua9d0-\ua9d9\uaa50-\uaa59\uabf0-\uabf9\uff10-\uff19",astral:"\ud804[\udc66-\udc6f\udcf0-\udcf9\udd36-\udd3f\uddd0-\uddd9]|\ud805[\udec0-\udec9]|\ud801[\udca0-\udca9]|\ud835[\udfce-\udfff]"},{name:"Nl",alias:"Letter_Number",bmp:"\u16ee-\u16f0\u2160-\u2182\u2185-\u2188\u3007\u3021-\u3029\u3038-\u303a\ua6e6-\ua6ef",astral:"\ud800[\udd40-\udd74\udf41\udf4a\udfd1-\udfd5]|\ud809[\udc00-\udc62]"},{name:"No",alias:"Other_Number",bmp:"\u00b2\u00b3\u00b9\u00bc-\u00be\u09f4-\u09f9\u0b72-\u0b77\u0bf0-\u0bf2\u0c78-\u0c7e\u0d70-\u0d75\u0f2a-\u0f33\u1369-\u137c\u17f0-\u17f9\u19da\u2070\u2074-\u2079\u2080-\u2089\u2150-\u215f\u2189\u2460-\u249b\u24ea-\u24ff\u2776-\u2793\u2cfd\u3192-\u3195\u3220-\u3229\u3248-\u324f\u3251-\u325f\u3280-\u3289\u32b1-\u32bf\ua830-\ua835",astral:"\ud802[\udc58-\udc5f\udd16-\udd1b\ude40-\ude47\ude7d\ude7e\udf58-\udf5f\udf78-\udf7f]|\ud834[\udf60-\udf71]|\ud803[\ude60-\ude7e]|\ud800[\udd07-\udd33\udd75-\udd78\udd8a\udf20-\udf23]|\ud83c[\udd00-\udd0a]|\ud804[\udc52-\udc65]"},{name:"P",alias:"Punctuation",bmp:"!-#%-\\x2A,-/:;\\x3F@\\x5B-\\x5D_\\x7B}\u00a1\u00a7\u00ab\u00b6\u00b7\u00bb\u00bf\u037e\u0387\u055a-\u055f\u0589\u058a\u05be\u05c0\u05c3\u05c6\u05f3\u05f4\u0609\u060a\u060c\u060d\u061b\u061e\u061f\u066a-\u066d\u06d4\u0700-\u070d\u07f7-\u07f9\u0830-\u083e\u085e\u0964\u0965\u0970\u0af0\u0df4\u0e4f\u0e5a\u0e5b\u0f04-\u0f12\u0f14\u0f3a-\u0f3d\u0f85\u0fd0-\u0fd4\u0fd9\u0fda\u104a-\u104f\u10fb\u1360-\u1368\u1400\u166d\u166e\u169b\u169c\u16eb-\u16ed\u1735\u1736\u17d4-\u17d6\u17d8-\u17da\u1800-\u180a\u1944\u1945\u1a1e\u1a1f\u1aa0-\u1aa6\u1aa8-\u1aad\u1b5a-\u1b60\u1bfc-\u1bff\u1c3b-\u1c3f\u1c7e\u1c7f\u1cc0-\u1cc7\u1cd3\u2010-\u2027\u2030-\u2043\u2045-\u2051\u2053-\u205e\u207d\u207e\u208d\u208e\u2329\u232a\u2768-\u2775\u27c5\u27c6\u27e6-\u27ef\u2983-\u2998\u29d8-\u29db\u29fc\u29fd\u2cf9-\u2cfc\u2cfe\u2cff\u2d70\u2e00-\u2e2e\u2e30-\u2e3b\u3001-\u3003\u3008-\u3011\u3014-\u301f\u3030\u303d\u30a0\u30fb\ua4fe\ua4ff\ua60d-\ua60f\ua673\ua67e\ua6f2-\ua6f7\ua874-\ua877\ua8ce\ua8cf\ua8f8-\ua8fa\ua92e\ua92f\ua95f\ua9c1-\ua9cd\ua9de\ua9df\uaa5c-\uaa5f\uaade\uaadf\uaaf0\uaaf1\uabeb\ufd3e\ufd3f\ufe10-\ufe19\ufe30-\ufe52\ufe54-\ufe61\ufe63\ufe68\ufe6a\ufe6b\uff01-\uff03\uff05-\uff0a\uff0c-\uff0f\uff1a\uff1b\uff1f\uff20\uff3b-\uff3d\uff3f\uff5b\uff5d\uff5f-\uff65",astral:"\ud809[\udc70-\udc73]|\ud802[\udc57\udd1f\udd3f\ude50-\ude58\ude7f\udf39-\udf3f]|\ud800[\udd00-\udd02\udf9f\udfd0]|\ud804[\udc47-\udc4d\udcbb\udcbc\udcbe-\udcc1\udd40-\udd43\uddc5-\uddc8]"},{name:"Pc",alias:"Connector_Punctuation",bmp:"_\u203f\u2040\u2054\ufe33\ufe34\ufe4d-\ufe4f\uff3f"},{name:"Pd",alias:"Dash_Punctuation",bmp:"\\x2D\u058a\u05be\u1400\u1806\u2010-\u2015\u2e17\u2e1a\u2e3a\u2e3b\u301c\u3030\u30a0\ufe31\ufe32\ufe58\ufe63\uff0d"},{name:"Pe",alias:"Close_Punctuation",bmp:"\\x29\\x5D}\u0f3b\u0f3d\u169c\u2046\u207e\u208e\u232a\u2769\u276b\u276d\u276f\u2771\u2773\u2775\u27c6\u27e7\u27e9\u27eb\u27ed\u27ef\u2984\u2986\u2988\u298a\u298c\u298e\u2990\u2992\u2994\u2996\u2998\u29d9\u29db\u29fd\u2e23\u2e25\u2e27\u2e29\u3009\u300b\u300d\u300f\u3011\u3015\u3017\u3019\u301b\u301e\u301f\ufd3f\ufe18\ufe36\ufe38\ufe3a\ufe3c\ufe3e\ufe40\ufe42\ufe44\ufe48\ufe5a\ufe5c\ufe5e\uff09\uff3d\uff5d\uff60\uff63"},{name:"Pf",alias:"Final_Punctuation",bmp:"\u00bb\u2019\u201d\u203a\u2e03\u2e05\u2e0a\u2e0d\u2e1d\u2e21"},{name:"Pi",alias:"Initial_Punctuation",bmp:"\u00ab\u2018\u201b\u201c\u201f\u2039\u2e02\u2e04\u2e09\u2e0c\u2e1c\u2e20"},{name:"Po",alias:"Other_Punctuation",bmp:"!-#%-'\\x2A,\\x2E/:;\\x3F@\\x5C\u00a1\u00a7\u00b6\u00b7\u00bf\u037e\u0387\u055a-\u055f\u0589\u05c0\u05c3\u05c6\u05f3\u05f4\u0609\u060a\u060c\u060d\u061b\u061e\u061f\u066a-\u066d\u06d4\u0700-\u070d\u07f7-\u07f9\u0830-\u083e\u085e\u0964\u0965\u0970\u0af0\u0df4\u0e4f\u0e5a\u0e5b\u0f04-\u0f12\u0f14\u0f85\u0fd0-\u0fd4\u0fd9\u0fda\u104a-\u104f\u10fb\u1360-\u1368\u166d\u166e\u16eb-\u16ed\u1735\u1736\u17d4-\u17d6\u17d8-\u17da\u1800-\u1805\u1807-\u180a\u1944\u1945\u1a1e\u1a1f\u1aa0-\u1aa6\u1aa8-\u1aad\u1b5a-\u1b60\u1bfc-\u1bff\u1c3b-\u1c3f\u1c7e\u1c7f\u1cc0-\u1cc7\u1cd3\u2016\u2017\u2020-\u2027\u2030-\u2038\u203b-\u203e\u2041-\u2043\u2047-\u2051\u2053\u2055-\u205e\u2cf9-\u2cfc\u2cfe\u2cff\u2d70\u2e00\u2e01\u2e06-\u2e08\u2e0b\u2e0e-\u2e16\u2e18\u2e19\u2e1b\u2e1e\u2e1f\u2e2a-\u2e2e\u2e30-\u2e39\u3001-\u3003\u303d\u30fb\ua4fe\ua4ff\ua60d-\ua60f\ua673\ua67e\ua6f2-\ua6f7\ua874-\ua877\ua8ce\ua8cf\ua8f8-\ua8fa\ua92e\ua92f\ua95f\ua9c1-\ua9cd\ua9de\ua9df\uaa5c-\uaa5f\uaade\uaadf\uaaf0\uaaf1\uabeb\ufe10-\ufe16\ufe19\ufe30\ufe45\ufe46\ufe49-\ufe4c\ufe50-\ufe52\ufe54-\ufe57\ufe5f-\ufe61\ufe68\ufe6a\ufe6b\uff01-\uff03\uff05-\uff07\uff0a\uff0c\uff0e\uff0f\uff1a\uff1b\uff1f\uff20\uff3c\uff61\uff64\uff65",astral:"\ud809[\udc70-\udc73]|\ud802[\udc57\udd1f\udd3f\ude50-\ude58\ude7f\udf39-\udf3f]|\ud800[\udd00-\udd02\udf9f\udfd0]|\ud804[\udc47-\udc4d\udcbb\udcbc\udcbe-\udcc1\udd40-\udd43\uddc5-\uddc8]"},{name:"Ps",alias:"Open_Punctuation",bmp:"\\x28\\x5B\\x7B\u0f3a\u0f3c\u169b\u201a\u201e\u2045\u207d\u208d\u2329\u2768\u276a\u276c\u276e\u2770\u2772\u2774\u27c5\u27e6\u27e8\u27ea\u27ec\u27ee\u2983\u2985\u2987\u2989\u298b\u298d\u298f\u2991\u2993\u2995\u2997\u29d8\u29da\u29fc\u2e22\u2e24\u2e26\u2e28\u3008\u300a\u300c\u300e\u3010\u3014\u3016\u3018\u301a\u301d\ufd3e\ufe17\ufe35\ufe37\ufe39\ufe3b\ufe3d\ufe3f\ufe41\ufe43\ufe47\ufe59\ufe5b\ufe5d\uff08\uff3b\uff5b\uff5f\uff62"},{name:"S",alias:"Symbol",bmp:"\\x24\\x2B<->\\x5E`\\x7C~\u00a2-\u00a6\u00a8\u00a9\u00ac\u00ae-\u00b1\u00b4\u00b8\u00d7\u00f7\u02c2-\u02c5\u02d2-\u02df\u02e5-\u02eb\u02ed\u02ef-\u02ff\u0375\u0384\u0385\u03f6\u0482\u058f\u0606-\u0608\u060b\u060e\u060f\u06de\u06e9\u06fd\u06fe\u07f6\u09f2\u09f3\u09fa\u09fb\u0af1\u0b70\u0bf3-\u0bfa\u0c7f\u0d79\u0e3f\u0f01-\u0f03\u0f13\u0f15-\u0f17\u0f1a-\u0f1f\u0f34\u0f36\u0f38\u0fbe-\u0fc5\u0fc7-\u0fcc\u0fce\u0fcf\u0fd5-\u0fd8\u109e\u109f\u1390-\u1399\u17db\u1940\u19de-\u19ff\u1b61-\u1b6a\u1b74-\u1b7c\u1fbd\u1fbf-\u1fc1\u1fcd-\u1fcf\u1fdd-\u1fdf\u1fed-\u1fef\u1ffd\u1ffe\u2044\u2052\u207a-\u207c\u208a-\u208c\u20a0-\u20ba\u2100\u2101\u2103-\u2106\u2108\u2109\u2114\u2116-\u2118\u211e-\u2123\u2125\u2127\u2129\u212e\u213a\u213b\u2140-\u2144\u214a-\u214d\u214f\u2190-\u2328\u232b-\u23f3\u2400-\u2426\u2440-\u244a\u249c-\u24e9\u2500-\u26ff\u2701-\u2767\u2794-\u27c4\u27c7-\u27e5\u27f0-\u2982\u2999-\u29d7\u29dc-\u29fb\u29fe-\u2b4c\u2b50-\u2b59\u2ce5-\u2cea\u2e80-\u2e99\u2e9b-\u2ef3\u2f00-\u2fd5\u2ff0-\u2ffb\u3004\u3012\u3013\u3020\u3036\u3037\u303e\u303f\u309b\u309c\u3190\u3191\u3196-\u319f\u31c0-\u31e3\u3200-\u321e\u322a-\u3247\u3250\u3260-\u327f\u328a-\u32b0\u32c0-\u32fe\u3300-\u33ff\u4dc0-\u4dff\ua490-\ua4c6\ua700-\ua716\ua720\ua721\ua789\ua78a\ua828-\ua82b\ua836-\ua839\uaa77-\uaa79\ufb29\ufbb2-\ufbc1\ufdfc\ufdfd\ufe62\ufe64-\ufe66\ufe69\uff04\uff0b\uff1c-\uff1e\uff3e\uff40\uff5c\uff5e\uffe0-\uffe6\uffe8-\uffee\ufffc\ufffd",astral:"\ud83d[\udc00-\udc3e\udc40\udc42-\udcf7\udcf9-\udcfc\udd00-\udd3d\udd40-\udd43\udd50-\udd67\uddfb-\ude40\ude45-\ude4f\ude80-\udec5\udf00-\udf73]|\ud835[\udec1\udedb\udefb\udf15\udf35\udf4f\udf6f\udf89\udfa9\udfc3]|\ud83c[\udc00-\udc2b\udc30-\udc93\udca0-\udcae\udcb1-\udcbe\udcc1-\udccf\udcd1-\udcdf\udd10-\udd2e\udd30-\udd6b\udd70-\udd9a\udde6-\ude02\ude10-\ude3a\ude40-\ude48\ude50\ude51\udf00-\udf20\udf30-\udf35\udf37-\udf7c\udf80-\udf93\udfa0-\udfc4\udfc6-\udfca\udfe0-\udff0]|\ud834[\udc00-\udcf5\udd00-\udd26\udd29-\udd64\udd6a-\udd6c\udd83\udd84\udd8c-\udda9\uddae-\udddd\ude00-\ude41\ude45\udf00-\udf56]|\ud800[\udd37-\udd3f\udd79-\udd89\udd90-\udd9b\uddd0-\uddfc]|\ud83b[\udef0\udef1]"},{name:"Sc",alias:"Currency_Symbol",bmp:"\\x24\u00a2-\u00a5\u058f\u060b\u09f2\u09f3\u09fb\u0af1\u0bf9\u0e3f\u17db\u20a0-\u20ba\ua838\ufdfc\ufe69\uff04\uffe0\uffe1\uffe5\uffe6"},{name:"Sk",alias:"Modifier_Symbol",bmp:"\\x5E`\u00a8\u00af\u00b4\u00b8\u02c2-\u02c5\u02d2-\u02df\u02e5-\u02eb\u02ed\u02ef-\u02ff\u0375\u0384\u0385\u1fbd\u1fbf-\u1fc1\u1fcd-\u1fcf\u1fdd-\u1fdf\u1fed-\u1fef\u1ffd\u1ffe\u309b\u309c\ua700-\ua716\ua720\ua721\ua789\ua78a\ufbb2-\ufbc1\uff3e\uff40\uffe3"},{name:"Sm",alias:"Math_Symbol",bmp:"\\x2B<->\\x7C~\u00ac\u00b1\u00d7\u00f7\u03f6\u0606-\u0608\u2044\u2052\u207a-\u207c\u208a-\u208c\u2118\u2140-\u2144\u214b\u2190-\u2194\u219a\u219b\u21a0\u21a3\u21a6\u21ae\u21ce\u21cf\u21d2\u21d4\u21f4-\u22ff\u2308-\u230b\u2320\u2321\u237c\u239b-\u23b3\u23dc-\u23e1\u25b7\u25c1\u25f8-\u25ff\u266f\u27c0-\u27c4\u27c7-\u27e5\u27f0-\u27ff\u2900-\u2982\u2999-\u29d7\u29dc-\u29fb\u29fe-\u2aff\u2b30-\u2b44\u2b47-\u2b4c\ufb29\ufe62\ufe64-\ufe66\uff0b\uff1c-\uff1e\uff5c\uff5e\uffe2\uffe9-\uffec",astral:"\ud83b[\udef0\udef1]|\ud835[\udec1\udedb\udefb\udf15\udf35\udf4f\udf6f\udf89\udfa9\udfc3]"},{name:"So",alias:"Other_Symbol",bmp:"\u00a6\u00a9\u00ae\u00b0\u0482\u060e\u060f\u06de\u06e9\u06fd\u06fe\u07f6\u09fa\u0b70\u0bf3-\u0bf8\u0bfa\u0c7f\u0d79\u0f01-\u0f03\u0f13\u0f15-\u0f17\u0f1a-\u0f1f\u0f34\u0f36\u0f38\u0fbe-\u0fc5\u0fc7-\u0fcc\u0fce\u0fcf\u0fd5-\u0fd8\u109e\u109f\u1390-\u1399\u1940\u19de-\u19ff\u1b61-\u1b6a\u1b74-\u1b7c\u2100\u2101\u2103-\u2106\u2108\u2109\u2114\u2116\u2117\u211e-\u2123\u2125\u2127\u2129\u212e\u213a\u213b\u214a\u214c\u214d\u214f\u2195-\u2199\u219c-\u219f\u21a1\u21a2\u21a4\u21a5\u21a7-\u21ad\u21af-\u21cd\u21d0\u21d1\u21d3\u21d5-\u21f3\u2300-\u2307\u230c-\u231f\u2322-\u2328\u232b-\u237b\u237d-\u239a\u23b4-\u23db\u23e2-\u23f3\u2400-\u2426\u2440-\u244a\u249c-\u24e9\u2500-\u25b6\u25b8-\u25c0\u25c2-\u25f7\u2600-\u266e\u2670-\u26ff\u2701-\u2767\u2794-\u27bf\u2800-\u28ff\u2b00-\u2b2f\u2b45\u2b46\u2b50-\u2b59\u2ce5-\u2cea\u2e80-\u2e99\u2e9b-\u2ef3\u2f00-\u2fd5\u2ff0-\u2ffb\u3004\u3012\u3013\u3020\u3036\u3037\u303e\u303f\u3190\u3191\u3196-\u319f\u31c0-\u31e3\u3200-\u321e\u322a-\u3247\u3250\u3260-\u327f\u328a-\u32b0\u32c0-\u32fe\u3300-\u33ff\u4dc0-\u4dff\ua490-\ua4c6\ua828-\ua82b\ua836\ua837\ua839\uaa77-\uaa79\ufdfd\uffe4\uffe8\uffed\uffee\ufffc\ufffd",astral:"\ud83d[\udc00-\udc3e\udc40\udc42-\udcf7\udcf9-\udcfc\udd00-\udd3d\udd40-\udd43\udd50-\udd67\uddfb-\ude40\ude45-\ude4f\ude80-\udec5\udf00-\udf73]|\ud834[\udc00-\udcf5\udd00-\udd26\udd29-\udd64\udd6a-\udd6c\udd83\udd84\udd8c-\udda9\uddae-\udddd\ude00-\ude41\ude45\udf00-\udf56]|\ud83c[\udc00-\udc2b\udc30-\udc93\udca0-\udcae\udcb1-\udcbe\udcc1-\udccf\udcd1-\udcdf\udd10-\udd2e\udd30-\udd6b\udd70-\udd9a\udde6-\ude02\ude10-\ude3a\ude40-\ude48\ude50\ude51\udf00-\udf20\udf30-\udf35\udf37-\udf7c\udf80-\udf93\udfa0-\udfc4\udfc6-\udfca\udfe0-\udff0]|\ud800[\udd37-\udd3f\udd79-\udd89\udd90-\udd9b\uddd0-\uddfc]"},{name:"Z",alias:"Separator",bmp:" \u00a0\u1680\u180e\u2000-\u200a\u2028\u2029\u202f\u205f\u3000"},{name:"Zl",alias:"Line_Separator",bmp:"\u2028"},{name:"Zp",alias:"Paragraph_Separator",bmp:"\u2029"},{name:"Zs",alias:"Space_Separator",bmp:" \u00a0\u1680\u180e\u2000-\u200a\u202f\u205f\u3000"}]);if(!g.addUnicodeData)throw new ReferenceError("Unicode Base must be loaded before Unicode Properties");g.addUnicodeData([{name:"ASCII",bmp:"\x00-\u007f"},{name:"Alphabetic",bmp:"A-Za-z\u00aa\u00b5\u00ba\u00c0-\u00d6\u00d8-\u00f6\u00f8-\u02c1\u02c6-\u02d1\u02e0-\u02e4\u02ec\u02ee\u0345\u0370-\u0374\u0376\u0377\u037a-\u037d\u0386\u0388-\u038a\u038c\u038e-\u03a1\u03a3-\u03f5\u03f7-\u0481\u048a-\u0527\u0531-\u0556\u0559\u0561-\u0587\u05b0-\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u05d0-\u05ea\u05f0-\u05f2\u0610-\u061a\u0620-\u0657\u0659-\u065f\u066e-\u06d3\u06d5-\u06dc\u06e1-\u06e8\u06ed-\u06ef\u06fa-\u06fc\u06ff\u0710-\u073f\u074d-\u07b1\u07ca-\u07ea\u07f4\u07f5\u07fa\u0800-\u0817\u081a-\u082c\u0840-\u0858\u08a0\u08a2-\u08ac\u08e4-\u08e9\u08f0-\u08fe\u0900-\u093b\u093d-\u094c\u094e-\u0950\u0955-\u0963\u0971-\u0977\u0979-\u097f\u0981-\u0983\u0985-\u098c\u098f\u0990\u0993-\u09a8\u09aa-\u09b0\u09b2\u09b6-\u09b9\u09bd-\u09c4\u09c7\u09c8\u09cb\u09cc\u09ce\u09d7\u09dc\u09dd\u09df-\u09e3\u09f0\u09f1\u0a01-\u0a03\u0a05-\u0a0a\u0a0f\u0a10\u0a13-\u0a28\u0a2a-\u0a30\u0a32\u0a33\u0a35\u0a36\u0a38\u0a39\u0a3e-\u0a42\u0a47\u0a48\u0a4b\u0a4c\u0a51\u0a59-\u0a5c\u0a5e\u0a70-\u0a75\u0a81-\u0a83\u0a85-\u0a8d\u0a8f-\u0a91\u0a93-\u0aa8\u0aaa-\u0ab0\u0ab2\u0ab3\u0ab5-\u0ab9\u0abd-\u0ac5\u0ac7-\u0ac9\u0acb\u0acc\u0ad0\u0ae0-\u0ae3\u0b01-\u0b03\u0b05-\u0b0c\u0b0f\u0b10\u0b13-\u0b28\u0b2a-\u0b30\u0b32\u0b33\u0b35-\u0b39\u0b3d-\u0b44\u0b47\u0b48\u0b4b\u0b4c\u0b56\u0b57\u0b5c\u0b5d\u0b5f-\u0b63\u0b71\u0b82\u0b83\u0b85-\u0b8a\u0b8e-\u0b90\u0b92-\u0b95\u0b99\u0b9a\u0b9c\u0b9e\u0b9f\u0ba3\u0ba4\u0ba8-\u0baa\u0bae-\u0bb9\u0bbe-\u0bc2\u0bc6-\u0bc8\u0bca-\u0bcc\u0bd0\u0bd7\u0c01-\u0c03\u0c05-\u0c0c\u0c0e-\u0c10\u0c12-\u0c28\u0c2a-\u0c33\u0c35-\u0c39\u0c3d-\u0c44\u0c46-\u0c48\u0c4a-\u0c4c\u0c55\u0c56\u0c58\u0c59\u0c60-\u0c63\u0c82\u0c83\u0c85-\u0c8c\u0c8e-\u0c90\u0c92-\u0ca8\u0caa-\u0cb3\u0cb5-\u0cb9\u0cbd-\u0cc4\u0cc6-\u0cc8\u0cca-\u0ccc\u0cd5\u0cd6\u0cde\u0ce0-\u0ce3\u0cf1\u0cf2\u0d02\u0d03\u0d05-\u0d0c\u0d0e-\u0d10\u0d12-\u0d3a\u0d3d-\u0d44\u0d46-\u0d48\u0d4a-\u0d4c\u0d4e\u0d57\u0d60-\u0d63\u0d7a-\u0d7f\u0d82\u0d83\u0d85-\u0d96\u0d9a-\u0db1\u0db3-\u0dbb\u0dbd\u0dc0-\u0dc6\u0dcf-\u0dd4\u0dd6\u0dd8-\u0ddf\u0df2\u0df3\u0e01-\u0e3a\u0e40-\u0e46\u0e4d\u0e81\u0e82\u0e84\u0e87\u0e88\u0e8a\u0e8d\u0e94-\u0e97\u0e99-\u0e9f\u0ea1-\u0ea3\u0ea5\u0ea7\u0eaa\u0eab\u0ead-\u0eb9\u0ebb-\u0ebd\u0ec0-\u0ec4\u0ec6\u0ecd\u0edc-\u0edf\u0f00\u0f40-\u0f47\u0f49-\u0f6c\u0f71-\u0f81\u0f88-\u0f97\u0f99-\u0fbc\u1000-\u1036\u1038\u103b-\u103f\u1050-\u1062\u1065-\u1068\u106e-\u1086\u108e\u109c\u109d\u10a0-\u10c5\u10c7\u10cd\u10d0-\u10fa\u10fc-\u1248\u124a-\u124d\u1250-\u1256\u1258\u125a-\u125d\u1260-\u1288\u128a-\u128d\u1290-\u12b0\u12b2-\u12b5\u12b8-\u12be\u12c0\u12c2-\u12c5\u12c8-\u12d6\u12d8-\u1310\u1312-\u1315\u1318-\u135a\u135f\u1380-\u138f\u13a0-\u13f4\u1401-\u166c\u166f-\u167f\u1681-\u169a\u16a0-\u16ea\u16ee-\u16f0\u1700-\u170c\u170e-\u1713\u1720-\u1733\u1740-\u1753\u1760-\u176c\u176e-\u1770\u1772\u1773\u1780-\u17b3\u17b6-\u17c8\u17d7\u17dc\u1820-\u1877\u1880-\u18aa\u18b0-\u18f5\u1900-\u191c\u1920-\u192b\u1930-\u1938\u1950-\u196d\u1970-\u1974\u1980-\u19ab\u19b0-\u19c9\u1a00-\u1a1b\u1a20-\u1a5e\u1a61-\u1a74\u1aa7\u1b00-\u1b33\u1b35-\u1b43\u1b45-\u1b4b\u1b80-\u1ba9\u1bac-\u1baf\u1bba-\u1be5\u1be7-\u1bf1\u1c00-\u1c35\u1c4d-\u1c4f\u1c5a-\u1c7d\u1ce9-\u1cec\u1cee-\u1cf3\u1cf5\u1cf6\u1d00-\u1dbf\u1e00-\u1f15\u1f18-\u1f1d\u1f20-\u1f45\u1f48-\u1f4d\u1f50-\u1f57\u1f59\u1f5b\u1f5d\u1f5f-\u1f7d\u1f80-\u1fb4\u1fb6-\u1fbc\u1fbe\u1fc2-\u1fc4\u1fc6-\u1fcc\u1fd0-\u1fd3\u1fd6-\u1fdb\u1fe0-\u1fec\u1ff2-\u1ff4\u1ff6-\u1ffc\u2071\u207f\u2090-\u209c\u2102\u2107\u210a-\u2113\u2115\u2119-\u211d\u2124\u2126\u2128\u212a-\u212d\u212f-\u2139\u213c-\u213f\u2145-\u2149\u214e\u2160-\u2188\u24b6-\u24e9\u2c00-\u2c2e\u2c30-\u2c5e\u2c60-\u2ce4\u2ceb-\u2cee\u2cf2\u2cf3\u2d00-\u2d25\u2d27\u2d2d\u2d30-\u2d67\u2d6f\u2d80-\u2d96\u2da0-\u2da6\u2da8-\u2dae\u2db0-\u2db6\u2db8-\u2dbe\u2dc0-\u2dc6\u2dc8-\u2dce\u2dd0-\u2dd6\u2dd8-\u2dde\u2de0-\u2dff\u2e2f\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303c\u3041-\u3096\u309d-\u309f\u30a1-\u30fa\u30fc-\u30ff\u3105-\u312d\u3131-\u318e\u31a0-\u31ba\u31f0-\u31ff\u3400-\u4db5\u4e00-\u9fcc\ua000-\ua48c\ua4d0-\ua4fd\ua500-\ua60c\ua610-\ua61f\ua62a\ua62b\ua640-\ua66e\ua674-\ua67b\ua67f-\ua697\ua69f-\ua6ef\ua717-\ua71f\ua722-\ua788\ua78b-\ua78e\ua790-\ua793\ua7a0-\ua7aa\ua7f8-\ua801\ua803-\ua805\ua807-\ua80a\ua80c-\ua827\ua840-\ua873\ua880-\ua8c3\ua8f2-\ua8f7\ua8fb\ua90a-\ua92a\ua930-\ua952\ua960-\ua97c\ua980-\ua9b2\ua9b4-\ua9bf\ua9cf\uaa00-\uaa36\uaa40-\uaa4d\uaa60-\uaa76\uaa7a\uaa80-\uaabe\uaac0\uaac2\uaadb-\uaadd\uaae0-\uaaef\uaaf2-\uaaf5\uab01-\uab06\uab09-\uab0e\uab11-\uab16\uab20-\uab26\uab28-\uab2e\uabc0-\uabea\uac00-\ud7a3\ud7b0-\ud7c6\ud7cb-\ud7fb\uf900-\ufa6d\ufa70-\ufad9\ufb00-\ufb06\ufb13-\ufb17\ufb1d-\ufb28\ufb2a-\ufb36\ufb38-\ufb3c\ufb3e\ufb40\ufb41\ufb43\ufb44\ufb46-\ufbb1\ufbd3-\ufd3d\ufd50-\ufd8f\ufd92-\ufdc7\ufdf0-\ufdfb\ufe70-\ufe74\ufe76-\ufefc\uff21-\uff3a\uff41-\uff5a\uff66-\uffbe\uffc2-\uffc7\uffca-\uffcf\uffd2-\uffd7\uffda-\uffdc",astral:"\ud803[\udc00-\udc48]|\ud801[\udc00-\udc9d]|\ud809[\udc00-\udc62]|\ud81a[\udc00-\ude38]|\ud804[\udc00-\udc45\udc82-\udcb8\udcd0-\udce8\udd00-\udd32\udd80-\uddbf\uddc1-\uddc4]|[\ud80c\ud840-\ud868\ud86a-\ud86c][\udc00-\udfff]|\ud86e[\udc00-\udc1d]|\ud86d[\udc00-\udf34\udf40-\udfff]|\ud80d[\udc00-\udc2e]|\ud87e[\udc00-\ude1d]|\ud802[\udc00-\udc05\udc08\udc0a-\udc35\udc37\udc38\udc3c\udc3f-\udc55\udd00-\udd15\udd20-\udd39\udd80-\uddb7\uddbe\uddbf\ude00-\ude03\ude05\ude06\ude0c-\ude13\ude15-\ude17\ude19-\ude33\ude60-\ude7c\udf00-\udf35\udf40-\udf55\udf60-\udf72]|\ud800[\udc00-\udc0b\udc0d-\udc26\udc28-\udc3a\udc3c\udc3d\udc3f-\udc4d\udc50-\udc5d\udc80-\udcfa\udd40-\udd74\ude80-\ude9c\udea0-\uded0\udf00-\udf1e\udf30-\udf4a\udf80-\udf9d\udfa0-\udfc3\udfc8-\udfcf\udfd1-\udfd5]|\ud81b[\udf00-\udf44\udf50-\udf7e\udf93-\udf9f]|\ud835[\udc00-\udc54\udc56-\udc9c\udc9e\udc9f\udca2\udca5\udca6\udca9-\udcac\udcae-\udcb9\udcbb\udcbd-\udcc3\udcc5-\udd05\udd07-\udd0a\udd0d-\udd14\udd16-\udd1c\udd1e-\udd39\udd3b-\udd3e\udd40-\udd44\udd46\udd4a-\udd50\udd52-\udea5\udea8-\udec0\udec2-\udeda\udedc-\udefa\udefc-\udf14\udf16-\udf34\udf36-\udf4e\udf50-\udf6e\udf70-\udf88\udf8a-\udfa8\udfaa-\udfc2\udfc4-\udfcb]|\ud83b[\ude00-\ude03\ude05-\ude1f\ude21\ude22\ude24\ude27\ude29-\ude32\ude34-\ude37\ude39\ude3b\ude42\ude47\ude49\ude4b\ude4d-\ude4f\ude51\ude52\ude54\ude57\ude59\ude5b\ude5d\ude5f\ude61\ude62\ude64\ude67-\ude6a\ude6c-\ude72\ude74-\ude77\ude79-\ude7c\ude7e\ude80-\ude89\ude8b-\ude9b\udea1-\udea3\udea5-\udea9\udeab-\udebb]|\ud869[\udc00-\uded6\udf00-\udfff]|\ud82c[\udc00\udc01]|\ud808[\udc00-\udf6e]|\ud805[\ude80-\udeb5]"},{name:"Any",isBmpLast:!0,bmp:"\x00-\uffff",astral:"[\ud800-\udbff][\udc00-\udfff]"},{name:"Assigned",inverseOf:"Cn"},{name:"Default_Ignorable_Code_Point",bmp:"\u00ad\u034f\u115f\u1160\u17b4\u17b5\u180b-\u180d\u200b-\u200f\u202a-\u202e\u2060-\u206f\u3164\ufe00-\ufe0f\ufeff\uffa0\ufff0-\ufff8",astral:"[\udb40-\udb43][\udc00-\udfff]|\ud834[\udd73-\udd7a]"},{name:"Lowercase",bmp:"a-z\u00aa\u00b5\u00ba\u00df-\u00f6\u00f8-\u00ff\u0101\u0103\u0105\u0107\u0109\u010b\u010d\u010f\u0111\u0113\u0115\u0117\u0119\u011b\u011d\u011f\u0121\u0123\u0125\u0127\u0129\u012b\u012d\u012f\u0131\u0133\u0135\u0137\u0138\u013a\u013c\u013e\u0140\u0142\u0144\u0146\u0148\u0149\u014b\u014d\u014f\u0151\u0153\u0155\u0157\u0159\u015b\u015d\u015f\u0161\u0163\u0165\u0167\u0169\u016b\u016d\u016f\u0171\u0173\u0175\u0177\u017a\u017c\u017e-\u0180\u0183\u0185\u0188\u018c\u018d\u0192\u0195\u0199-\u019b\u019e\u01a1\u01a3\u01a5\u01a8\u01aa\u01ab\u01ad\u01b0\u01b4\u01b6\u01b9\u01ba\u01bd-\u01bf\u01c6\u01c9\u01cc\u01ce\u01d0\u01d2\u01d4\u01d6\u01d8\u01da\u01dc\u01dd\u01df\u01e1\u01e3\u01e5\u01e7\u01e9\u01eb\u01ed\u01ef\u01f0\u01f3\u01f5\u01f9\u01fb\u01fd\u01ff\u0201\u0203\u0205\u0207\u0209\u020b\u020d\u020f\u0211\u0213\u0215\u0217\u0219\u021b\u021d\u021f\u0221\u0223\u0225\u0227\u0229\u022b\u022d\u022f\u0231\u0233-\u0239\u023c\u023f\u0240\u0242\u0247\u0249\u024b\u024d\u024f-\u0293\u0295-\u02b8\u02c0\u02c1\u02e0-\u02e4\u0345\u0371\u0373\u0377\u037a-\u037d\u0390\u03ac-\u03ce\u03d0\u03d1\u03d5-\u03d7\u03d9\u03db\u03dd\u03df\u03e1\u03e3\u03e5\u03e7\u03e9\u03eb\u03ed\u03ef-\u03f3\u03f5\u03f8\u03fb\u03fc\u0430-\u045f\u0461\u0463\u0465\u0467\u0469\u046b\u046d\u046f\u0471\u0473\u0475\u0477\u0479\u047b\u047d\u047f\u0481\u048b\u048d\u048f\u0491\u0493\u0495\u0497\u0499\u049b\u049d\u049f\u04a1\u04a3\u04a5\u04a7\u04a9\u04ab\u04ad\u04af\u04b1\u04b3\u04b5\u04b7\u04b9\u04bb\u04bd\u04bf\u04c2\u04c4\u04c6\u04c8\u04ca\u04cc\u04ce\u04cf\u04d1\u04d3\u04d5\u04d7\u04d9\u04db\u04dd\u04df\u04e1\u04e3\u04e5\u04e7\u04e9\u04eb\u04ed\u04ef\u04f1\u04f3\u04f5\u04f7\u04f9\u04fb\u04fd\u04ff\u0501\u0503\u0505\u0507\u0509\u050b\u050d\u050f\u0511\u0513\u0515\u0517\u0519\u051b\u051d\u051f\u0521\u0523\u0525\u0527\u0561-\u0587\u1d00-\u1dbf\u1e01\u1e03\u1e05\u1e07\u1e09\u1e0b\u1e0d\u1e0f\u1e11\u1e13\u1e15\u1e17\u1e19\u1e1b\u1e1d\u1e1f\u1e21\u1e23\u1e25\u1e27\u1e29\u1e2b\u1e2d\u1e2f\u1e31\u1e33\u1e35\u1e37\u1e39\u1e3b\u1e3d\u1e3f\u1e41\u1e43\u1e45\u1e47\u1e49\u1e4b\u1e4d\u1e4f\u1e51\u1e53\u1e55\u1e57\u1e59\u1e5b\u1e5d\u1e5f\u1e61\u1e63\u1e65\u1e67\u1e69\u1e6b\u1e6d\u1e6f\u1e71\u1e73\u1e75\u1e77\u1e79\u1e7b\u1e7d\u1e7f\u1e81\u1e83\u1e85\u1e87\u1e89\u1e8b\u1e8d\u1e8f\u1e91\u1e93\u1e95-\u1e9d\u1e9f\u1ea1\u1ea3\u1ea5\u1ea7\u1ea9\u1eab\u1ead\u1eaf\u1eb1\u1eb3\u1eb5\u1eb7\u1eb9\u1ebb\u1ebd\u1ebf\u1ec1\u1ec3\u1ec5\u1ec7\u1ec9\u1ecb\u1ecd\u1ecf\u1ed1\u1ed3\u1ed5\u1ed7\u1ed9\u1edb\u1edd\u1edf\u1ee1\u1ee3\u1ee5\u1ee7\u1ee9\u1eeb\u1eed\u1eef\u1ef1\u1ef3\u1ef5\u1ef7\u1ef9\u1efb\u1efd\u1eff-\u1f07\u1f10-\u1f15\u1f20-\u1f27\u1f30-\u1f37\u1f40-\u1f45\u1f50-\u1f57\u1f60-\u1f67\u1f70-\u1f7d\u1f80-\u1f87\u1f90-\u1f97\u1fa0-\u1fa7\u1fb0-\u1fb4\u1fb6\u1fb7\u1fbe\u1fc2-\u1fc4\u1fc6\u1fc7\u1fd0-\u1fd3\u1fd6\u1fd7\u1fe0-\u1fe7\u1ff2-\u1ff4\u1ff6\u1ff7\u2071\u207f\u2090-\u209c\u210a\u210e\u210f\u2113\u212f\u2134\u2139\u213c\u213d\u2146-\u2149\u214e\u2170-\u217f\u2184\u24d0-\u24e9\u2c30-\u2c5e\u2c61\u2c65\u2c66\u2c68\u2c6a\u2c6c\u2c71\u2c73\u2c74\u2c76-\u2c7d\u2c81\u2c83\u2c85\u2c87\u2c89\u2c8b\u2c8d\u2c8f\u2c91\u2c93\u2c95\u2c97\u2c99\u2c9b\u2c9d\u2c9f\u2ca1\u2ca3\u2ca5\u2ca7\u2ca9\u2cab\u2cad\u2caf\u2cb1\u2cb3\u2cb5\u2cb7\u2cb9\u2cbb\u2cbd\u2cbf\u2cc1\u2cc3\u2cc5\u2cc7\u2cc9\u2ccb\u2ccd\u2ccf\u2cd1\u2cd3\u2cd5\u2cd7\u2cd9\u2cdb\u2cdd\u2cdf\u2ce1\u2ce3\u2ce4\u2cec\u2cee\u2cf3\u2d00-\u2d25\u2d27\u2d2d\ua641\ua643\ua645\ua647\ua649\ua64b\ua64d\ua64f\ua651\ua653\ua655\ua657\ua659\ua65b\ua65d\ua65f\ua661\ua663\ua665\ua667\ua669\ua66b\ua66d\ua681\ua683\ua685\ua687\ua689\ua68b\ua68d\ua68f\ua691\ua693\ua695\ua697\ua723\ua725\ua727\ua729\ua72b\ua72d\ua72f-\ua731\ua733\ua735\ua737\ua739\ua73b\ua73d\ua73f\ua741\ua743\ua745\ua747\ua749\ua74b\ua74d\ua74f\ua751\ua753\ua755\ua757\ua759\ua75b\ua75d\ua75f\ua761\ua763\ua765\ua767\ua769\ua76b\ua76d\ua76f-\ua778\ua77a\ua77c\ua77f\ua781\ua783\ua785\ua787\ua78c\ua78e\ua791\ua793\ua7a1\ua7a3\ua7a5\ua7a7\ua7a9\ua7f8-\ua7fa\ufb00-\ufb06\ufb13-\ufb17\uff41-\uff5a",astral:"\ud835[\udc1a-\udc33\udc4e-\udc54\udc56-\udc67\udc82-\udc9b\udcb6-\udcb9\udcbb\udcbd-\udcc3\udcc5-\udccf\udcea-\udd03\udd1e-\udd37\udd52-\udd6b\udd86-\udd9f\uddba-\uddd3\uddee-\ude07\ude22-\ude3b\ude56-\ude6f\ude8a-\udea5\udec2-\udeda\udedc-\udee1\udefc-\udf14\udf16-\udf1b\udf36-\udf4e\udf50-\udf55\udf70-\udf88\udf8a-\udf8f\udfaa-\udfc2\udfc4-\udfc9\udfcb]|\ud801[\udc28-\udc4f]"},{name:"Noncharacter_Code_Point",bmp:"\ufdd0-\ufdef\ufffe\uffff",astral:"[\udb3f\udb7f\udbbf\udbff\ud83f\ud87f\ud8bf\udaff\ud97f\ud9bf\ud9ff\uda3f\ud8ff\udabf\uda7f\ud93f][\udffe\udfff]"},{name:"Uppercase",bmp:"A-Z\u00c0-\u00d6\u00d8-\u00de\u0100\u0102\u0104\u0106\u0108\u010a\u010c\u010e\u0110\u0112\u0114\u0116\u0118\u011a\u011c\u011e\u0120\u0122\u0124\u0126\u0128\u012a\u012c\u012e\u0130\u0132\u0134\u0136\u0139\u013b\u013d\u013f\u0141\u0143\u0145\u0147\u014a\u014c\u014e\u0150\u0152\u0154\u0156\u0158\u015a\u015c\u015e\u0160\u0162\u0164\u0166\u0168\u016a\u016c\u016e\u0170\u0172\u0174\u0176\u0178\u0179\u017b\u017d\u0181\u0182\u0184\u0186\u0187\u0189-\u018b\u018e-\u0191\u0193\u0194\u0196-\u0198\u019c\u019d\u019f\u01a0\u01a2\u01a4\u01a6\u01a7\u01a9\u01ac\u01ae\u01af\u01b1-\u01b3\u01b5\u01b7\u01b8\u01bc\u01c4\u01c7\u01ca\u01cd\u01cf\u01d1\u01d3\u01d5\u01d7\u01d9\u01db\u01de\u01e0\u01e2\u01e4\u01e6\u01e8\u01ea\u01ec\u01ee\u01f1\u01f4\u01f6-\u01f8\u01fa\u01fc\u01fe\u0200\u0202\u0204\u0206\u0208\u020a\u020c\u020e\u0210\u0212\u0214\u0216\u0218\u021a\u021c\u021e\u0220\u0222\u0224\u0226\u0228\u022a\u022c\u022e\u0230\u0232\u023a\u023b\u023d\u023e\u0241\u0243-\u0246\u0248\u024a\u024c\u024e\u0370\u0372\u0376\u0386\u0388-\u038a\u038c\u038e\u038f\u0391-\u03a1\u03a3-\u03ab\u03cf\u03d2-\u03d4\u03d8\u03da\u03dc\u03de\u03e0\u03e2\u03e4\u03e6\u03e8\u03ea\u03ec\u03ee\u03f4\u03f7\u03f9\u03fa\u03fd-\u042f\u0460\u0462\u0464\u0466\u0468\u046a\u046c\u046e\u0470\u0472\u0474\u0476\u0478\u047a\u047c\u047e\u0480\u048a\u048c\u048e\u0490\u0492\u0494\u0496\u0498\u049a\u049c\u049e\u04a0\u04a2\u04a4\u04a6\u04a8\u04aa\u04ac\u04ae\u04b0\u04b2\u04b4\u04b6\u04b8\u04ba\u04bc\u04be\u04c0\u04c1\u04c3\u04c5\u04c7\u04c9\u04cb\u04cd\u04d0\u04d2\u04d4\u04d6\u04d8\u04da\u04dc\u04de\u04e0\u04e2\u04e4\u04e6\u04e8\u04ea\u04ec\u04ee\u04f0\u04f2\u04f4\u04f6\u04f8\u04fa\u04fc\u04fe\u0500\u0502\u0504\u0506\u0508\u050a\u050c\u050e\u0510\u0512\u0514\u0516\u0518\u051a\u051c\u051e\u0520\u0522\u0524\u0526\u0531-\u0556\u10a0-\u10c5\u10c7\u10cd\u1e00\u1e02\u1e04\u1e06\u1e08\u1e0a\u1e0c\u1e0e\u1e10\u1e12\u1e14\u1e16\u1e18\u1e1a\u1e1c\u1e1e\u1e20\u1e22\u1e24\u1e26\u1e28\u1e2a\u1e2c\u1e2e\u1e30\u1e32\u1e34\u1e36\u1e38\u1e3a\u1e3c\u1e3e\u1e40\u1e42\u1e44\u1e46\u1e48\u1e4a\u1e4c\u1e4e\u1e50\u1e52\u1e54\u1e56\u1e58\u1e5a\u1e5c\u1e5e\u1e60\u1e62\u1e64\u1e66\u1e68\u1e6a\u1e6c\u1e6e\u1e70\u1e72\u1e74\u1e76\u1e78\u1e7a\u1e7c\u1e7e\u1e80\u1e82\u1e84\u1e86\u1e88\u1e8a\u1e8c\u1e8e\u1e90\u1e92\u1e94\u1e9e\u1ea0\u1ea2\u1ea4\u1ea6\u1ea8\u1eaa\u1eac\u1eae\u1eb0\u1eb2\u1eb4\u1eb6\u1eb8\u1eba\u1ebc\u1ebe\u1ec0\u1ec2\u1ec4\u1ec6\u1ec8\u1eca\u1ecc\u1ece\u1ed0\u1ed2\u1ed4\u1ed6\u1ed8\u1eda\u1edc\u1ede\u1ee0\u1ee2\u1ee4\u1ee6\u1ee8\u1eea\u1eec\u1eee\u1ef0\u1ef2\u1ef4\u1ef6\u1ef8\u1efa\u1efc\u1efe\u1f08-\u1f0f\u1f18-\u1f1d\u1f28-\u1f2f\u1f38-\u1f3f\u1f48-\u1f4d\u1f59\u1f5b\u1f5d\u1f5f\u1f68-\u1f6f\u1fb8-\u1fbb\u1fc8-\u1fcb\u1fd8-\u1fdb\u1fe8-\u1fec\u1ff8-\u1ffb\u2102\u2107\u210b-\u210d\u2110-\u2112\u2115\u2119-\u211d\u2124\u2126\u2128\u212a-\u212d\u2130-\u2133\u213e\u213f\u2145\u2160-\u216f\u2183\u24b6-\u24cf\u2c00-\u2c2e\u2c60\u2c62-\u2c64\u2c67\u2c69\u2c6b\u2c6d-\u2c70\u2c72\u2c75\u2c7e-\u2c80\u2c82\u2c84\u2c86\u2c88\u2c8a\u2c8c\u2c8e\u2c90\u2c92\u2c94\u2c96\u2c98\u2c9a\u2c9c\u2c9e\u2ca0\u2ca2\u2ca4\u2ca6\u2ca8\u2caa\u2cac\u2cae\u2cb0\u2cb2\u2cb4\u2cb6\u2cb8\u2cba\u2cbc\u2cbe\u2cc0\u2cc2\u2cc4\u2cc6\u2cc8\u2cca\u2ccc\u2cce\u2cd0\u2cd2\u2cd4\u2cd6\u2cd8\u2cda\u2cdc\u2cde\u2ce0\u2ce2\u2ceb\u2ced\u2cf2\ua640\ua642\ua644\ua646\ua648\ua64a\ua64c\ua64e\ua650\ua652\ua654\ua656\ua658\ua65a\ua65c\ua65e\ua660\ua662\ua664\ua666\ua668\ua66a\ua66c\ua680\ua682\ua684\ua686\ua688\ua68a\ua68c\ua68e\ua690\ua692\ua694\ua696\ua722\ua724\ua726\ua728\ua72a\ua72c\ua72e\ua732\ua734\ua736\ua738\ua73a\ua73c\ua73e\ua740\ua742\ua744\ua746\ua748\ua74a\ua74c\ua74e\ua750\ua752\ua754\ua756\ua758\ua75a\ua75c\ua75e\ua760\ua762\ua764\ua766\ua768\ua76a\ua76c\ua76e\ua779\ua77b\ua77d\ua77e\ua780\ua782\ua784\ua786\ua78b\ua78d\ua790\ua792\ua7a0\ua7a2\ua7a4\ua7a6\ua7a8\ua7aa\uff21-\uff3a",astral:"\ud835[\udc00-\udc19\udc34-\udc4d\udc68-\udc81\udc9c\udc9e\udc9f\udca2\udca5\udca6\udca9-\udcac\udcae-\udcb5\udcd0-\udce9\udd04\udd05\udd07-\udd0a\udd0d-\udd14\udd16-\udd1c\udd38\udd39\udd3b-\udd3e\udd40-\udd44\udd46\udd4a-\udd50\udd6c-\udd85\udda0-\uddb9\uddd4-\udded\ude08-\ude21\ude3c-\ude55\ude70-\ude89\udea8-\udec0\udee2-\udefa\udf1c-\udf34\udf56-\udf6e\udf90-\udfa8\udfca]|\ud801[\udc00-\udc27]"},{name:"White_Space",bmp:"\t-\r \u0085\u00a0\u1680\u180e\u2000-\u200a\u2028\u2029\u202f\u205f\u3000"}]);if(!g.addUnicodeData)throw new ReferenceError("Unicode Base must be loaded before Unicode Scripts");g.addUnicodeData([{name:"Arabic",bmp:"\u0600-\u0604\u0606-\u060b\u060d-\u061a\u061e\u0620-\u063f\u0641-\u064a\u0656-\u065f\u066a-\u066f\u0671-\u06dc\u06de-\u06ff\u0750-\u077f\u08a0\u08a2-\u08ac\u08e4-\u08fe\ufb50-\ufbc1\ufbd3-\ufd3d\ufd50-\ufd8f\ufd92-\ufdc7\ufdf0-\ufdfc\ufe70-\ufe74\ufe76-\ufefc",astral:"\ud803[\ude60-\ude7e]|\ud83b[\ude00-\ude03\ude05-\ude1f\ude21\ude22\ude24\ude27\ude29-\ude32\ude34-\ude37\ude39\ude3b\ude42\ude47\ude49\ude4b\ude4d-\ude4f\ude51\ude52\ude54\ude57\ude59\ude5b\ude5d\ude5f\ude61\ude62\ude64\ude67-\ude6a\ude6c-\ude72\ude74-\ude77\ude79-\ude7c\ude7e\ude80-\ude89\ude8b-\ude9b\udea1-\udea3\udea5-\udea9\udeab-\udebb\udef0\udef1]"},{name:"Armenian",bmp:"\u0531-\u0556\u0559-\u055f\u0561-\u0587\u058a\u058f\ufb13-\ufb17"},{name:"Avestan",astral:"\ud802[\udf00-\udf35\udf39-\udf3f]"},{name:"Balinese",bmp:"\u1b00-\u1b4b\u1b50-\u1b7c"},{name:"Bamum",bmp:"\ua6a0-\ua6f7",astral:"\ud81a[\udc00-\ude38]"},{name:"Batak",bmp:"\u1bc0-\u1bf3\u1bfc-\u1bff"},{name:"Bengali",bmp:"\u0981-\u0983\u0985-\u098c\u098f\u0990\u0993-\u09a8\u09aa-\u09b0\u09b2\u09b6-\u09b9\u09bc-\u09c4\u09c7\u09c8\u09cb-\u09ce\u09d7\u09dc\u09dd\u09df-\u09e3\u09e6-\u09fb"},{name:"Bopomofo",bmp:"\u02ea\u02eb\u3105-\u312d\u31a0-\u31ba"},{name:"Brahmi",astral:"\ud804[\udc00-\udc4d\udc52-\udc6f]"},{name:"Braille",bmp:"\u2800-\u28ff"},{name:"Buginese",bmp:"\u1a00-\u1a1b\u1a1e\u1a1f"},{name:"Buhid",bmp:"\u1740-\u1753"},{name:"Canadian_Aboriginal",bmp:"\u1400-\u167f\u18b0-\u18f5"},{name:"Carian",astral:"\ud800[\udea0-\uded0]"},{name:"Chakma",astral:"\ud804[\udd00-\udd34\udd36-\udd43]"},{name:"Cham",bmp:"\uaa00-\uaa36\uaa40-\uaa4d\uaa50-\uaa59\uaa5c-\uaa5f"},{name:"Cherokee",bmp:"\u13a0-\u13f4"},{name:"Common",bmp:"\x00-@\\x5B-`\\x7B-\u00a9\u00ab-\u00b9\u00bb-\u00bf\u00d7\u00f7\u02b9-\u02df\u02e5-\u02e9\u02ec-\u02ff\u0374\u037e\u0385\u0387\u0589\u060c\u061b\u061f\u0640\u0660-\u0669\u06dd\u0964\u0965\u0e3f\u0fd5-\u0fd8\u10fb\u16eb-\u16ed\u1735\u1736\u1802\u1803\u1805\u1cd3\u1ce1\u1ce9-\u1cec\u1cee-\u1cf3\u1cf5\u1cf6\u2000-\u200b\u200e-\u2064\u206a-\u2070\u2074-\u207e\u2080-\u208e\u20a0-\u20ba\u2100-\u2125\u2127-\u2129\u212c-\u2131\u2133-\u214d\u214f-\u215f\u2189\u2190-\u23f3\u2400-\u2426\u2440-\u244a\u2460-\u26ff\u2701-\u27ff\u2900-\u2b4c\u2b50-\u2b59\u2e00-\u2e3b\u2ff0-\u2ffb\u3000-\u3004\u3006\u3008-\u3020\u3030-\u3037\u303c-\u303f\u309b\u309c\u30a0\u30fb\u30fc\u3190-\u319f\u31c0-\u31e3\u3220-\u325f\u327f-\u32cf\u3358-\u33ff\u4dc0-\u4dff\ua700-\ua721\ua788-\ua78a\ua830-\ua839\ufd3e\ufd3f\ufdfd\ufe10-\ufe19\ufe30-\ufe52\ufe54-\ufe66\ufe68-\ufe6b\ufeff\uff01-\uff20\uff3b-\uff40\uff5b-\uff65\uff70\uff9e\uff9f\uffe0-\uffe6\uffe8-\uffee\ufff9-\ufffd",astral:"\ud800[\udd00-\udd02\udd07-\udd33\udd37-\udd3f\udd90-\udd9b\uddd0-\uddfc]|\ud83c[\udc00-\udc2b\udc30-\udc93\udca0-\udcae\udcb1-\udcbe\udcc1-\udccf\udcd1-\udcdf\udd00-\udd0a\udd10-\udd2e\udd30-\udd6b\udd70-\udd9a\udde6-\uddff\ude01\ude02\ude10-\ude3a\ude40-\ude48\ude50\ude51\udf00-\udf20\udf30-\udf35\udf37-\udf7c\udf80-\udf93\udfa0-\udfc4\udfc6-\udfca\udfe0-\udff0]|\udb40[\udc01\udc20-\udc7f]|\ud835[\udc00-\udc54\udc56-\udc9c\udc9e\udc9f\udca2\udca5\udca6\udca9-\udcac\udcae-\udcb9\udcbb\udcbd-\udcc3\udcc5-\udd05\udd07-\udd0a\udd0d-\udd14\udd16-\udd1c\udd1e-\udd39\udd3b-\udd3e\udd40-\udd44\udd46\udd4a-\udd50\udd52-\udea5\udea8-\udfcb\udfce-\udfff]|\ud834[\udc00-\udcf5\udd00-\udd26\udd29-\udd66\udd6a-\udd7a\udd83\udd84\udd8c-\udda9\uddae-\udddd\udf00-\udf56\udf60-\udf71]|\ud83d[\udc00-\udc3e\udc40\udc42-\udcf7\udcf9-\udcfc\udd00-\udd3d\udd40-\udd43\udd50-\udd67\uddfb-\ude40\ude45-\ude4f\ude80-\udec5\udf00-\udf73]"},{name:"Coptic",bmp:"\u03e2-\u03ef\u2c80-\u2cf3\u2cf9-\u2cff"},{name:"Cuneiform",astral:"\ud809[\udc00-\udc62\udc70-\udc73]|\ud808[\udc00-\udf6e]"},{name:"Cypriot",astral:"\ud802[\udc00-\udc05\udc08\udc0a-\udc35\udc37\udc38\udc3c\udc3f]"},{name:"Cyrillic",bmp:"\u0400-\u0484\u0487-\u0527\u1d2b\u1d78\u2de0-\u2dff\ua640-\ua697\ua69f"},{name:"Deseret",astral:"\ud801[\udc00-\udc4f]"},{name:"Devanagari",bmp:"\u0900-\u0950\u0953-\u0963\u0966-\u0977\u0979-\u097f\ua8e0-\ua8fb"},{name:"Egyptian_Hieroglyphs",astral:"\ud80c[\udc00-\udfff]|\ud80d[\udc00-\udc2e]"},{name:"Ethiopic",bmp:"\u1200-\u1248\u124a-\u124d\u1250-\u1256\u1258\u125a-\u125d\u1260-\u1288\u128a-\u128d\u1290-\u12b0\u12b2-\u12b5\u12b8-\u12be\u12c0\u12c2-\u12c5\u12c8-\u12d6\u12d8-\u1310\u1312-\u1315\u1318-\u135a\u135d-\u137c\u1380-\u1399\u2d80-\u2d96\u2da0-\u2da6\u2da8-\u2dae\u2db0-\u2db6\u2db8-\u2dbe\u2dc0-\u2dc6\u2dc8-\u2dce\u2dd0-\u2dd6\u2dd8-\u2dde\uab01-\uab06\uab09-\uab0e\uab11-\uab16\uab20-\uab26\uab28-\uab2e"},{name:"Georgian",bmp:"\u10a0-\u10c5\u10c7\u10cd\u10d0-\u10fa\u10fc-\u10ff\u2d00-\u2d25\u2d27\u2d2d"},{name:"Glagolitic",bmp:"\u2c00-\u2c2e\u2c30-\u2c5e"},{name:"Gothic",astral:"\ud800[\udf30-\udf4a]"},{name:"Greek",bmp:"\u0370-\u0373\u0375-\u0377\u037a-\u037d\u0384\u0386\u0388-\u038a\u038c\u038e-\u03a1\u03a3-\u03e1\u03f0-\u03ff\u1d26-\u1d2a\u1d5d-\u1d61\u1d66-\u1d6a\u1dbf\u1f00-\u1f15\u1f18-\u1f1d\u1f20-\u1f45\u1f48-\u1f4d\u1f50-\u1f57\u1f59\u1f5b\u1f5d\u1f5f-\u1f7d\u1f80-\u1fb4\u1fb6-\u1fc4\u1fc6-\u1fd3\u1fd6-\u1fdb\u1fdd-\u1fef\u1ff2-\u1ff4\u1ff6-\u1ffe\u2126",astral:"\ud834[\ude00-\ude45]|\ud800[\udd40-\udd8a]"},{name:"Gujarati",bmp:"\u0a81-\u0a83\u0a85-\u0a8d\u0a8f-\u0a91\u0a93-\u0aa8\u0aaa-\u0ab0\u0ab2\u0ab3\u0ab5-\u0ab9\u0abc-\u0ac5\u0ac7-\u0ac9\u0acb-\u0acd\u0ad0\u0ae0-\u0ae3\u0ae6-\u0af1"},{name:"Gurmukhi",bmp:"\u0a01-\u0a03\u0a05-\u0a0a\u0a0f\u0a10\u0a13-\u0a28\u0a2a-\u0a30\u0a32\u0a33\u0a35\u0a36\u0a38\u0a39\u0a3c\u0a3e-\u0a42\u0a47\u0a48\u0a4b-\u0a4d\u0a51\u0a59-\u0a5c\u0a5e\u0a66-\u0a75"},{name:"Han",bmp:"\u2e80-\u2e99\u2e9b-\u2ef3\u2f00-\u2fd5\u3005\u3007\u3021-\u3029\u3038-\u303b\u3400-\u4db5\u4e00-\u9fcc\uf900-\ufa6d\ufa70-\ufad9",astral:"[\ud840-\ud868\ud86a-\ud86c][\udc00-\udfff]|\ud86d[\udc00-\udf34\udf40-\udfff]|\ud86e[\udc00-\udc1d]|\ud869[\udc00-\uded6\udf00-\udfff]|\ud87e[\udc00-\ude1d]"},{name:"Hangul",bmp:"\u1100-\u11ff\u302e\u302f\u3131-\u318e\u3200-\u321e\u3260-\u327e\ua960-\ua97c\uac00-\ud7a3\ud7b0-\ud7c6\ud7cb-\ud7fb\uffa0-\uffbe\uffc2-\uffc7\uffca-\uffcf\uffd2-\uffd7\uffda-\uffdc"},{name:"Hanunoo",bmp:"\u1720-\u1734"},{name:"Hebrew",bmp:"\u0591-\u05c7\u05d0-\u05ea\u05f0-\u05f4\ufb1d-\ufb36\ufb38-\ufb3c\ufb3e\ufb40\ufb41\ufb43\ufb44\ufb46-\ufb4f"},{name:"Hiragana",bmp:"\u3041-\u3096\u309d-\u309f",astral:"\ud82c\udc01|\ud83c\ude00"},{name:"Imperial_Aramaic",astral:"\ud802[\udc40-\udc55\udc57-\udc5f]"},{name:"Inherited",bmp:"\u0300-\u036f\u0485\u0486\u064b-\u0655\u0670\u0951\u0952\u1cd0-\u1cd2\u1cd4-\u1ce0\u1ce2-\u1ce8\u1ced\u1cf4\u1dc0-\u1de6\u1dfc-\u1dff\u200c\u200d\u20d0-\u20f0\u302a-\u302d\u3099\u309a\ufe00-\ufe0f\ufe20-\ufe26",astral:"\ud834[\udd67-\udd69\udd7b-\udd82\udd85-\udd8b\uddaa-\uddad]|\ud800\uddfd|\udb40[\udd00-\uddef]"},{name:"Inscriptional_Pahlavi",astral:"\ud802[\udf60-\udf72\udf78-\udf7f]"},{name:"Inscriptional_Parthian",astral:"\ud802[\udf40-\udf55\udf58-\udf5f]"},{name:"Javanese",bmp:"\ua980-\ua9cd\ua9cf-\ua9d9\ua9de\ua9df"},{name:"Kaithi",astral:"\ud804[\udc80-\udcc1]"},{name:"Kannada",bmp:"\u0c82\u0c83\u0c85-\u0c8c\u0c8e-\u0c90\u0c92-\u0ca8\u0caa-\u0cb3\u0cb5-\u0cb9\u0cbc-\u0cc4\u0cc6-\u0cc8\u0cca-\u0ccd\u0cd5\u0cd6\u0cde\u0ce0-\u0ce3\u0ce6-\u0cef\u0cf1\u0cf2"},{name:"Katakana",bmp:"\u30a1-\u30fa\u30fd-\u30ff\u31f0-\u31ff\u32d0-\u32fe\u3300-\u3357\uff66-\uff6f\uff71-\uff9d",astral:"\ud82c\udc00"},{name:"Kayah_Li",bmp:"\ua900-\ua92f"},{name:"Kharoshthi",astral:"\ud802[\ude00-\ude03\ude05\ude06\ude0c-\ude13\ude15-\ude17\ude19-\ude33\ude38-\ude3a\ude3f-\ude47\ude50-\ude58]"},{name:"Khmer",bmp:"\u1780-\u17dd\u17e0-\u17e9\u17f0-\u17f9\u19e0-\u19ff"},{name:"Lao",bmp:"\u0e81\u0e82\u0e84\u0e87\u0e88\u0e8a\u0e8d\u0e94-\u0e97\u0e99-\u0e9f\u0ea1-\u0ea3\u0ea5\u0ea7\u0eaa\u0eab\u0ead-\u0eb9\u0ebb-\u0ebd\u0ec0-\u0ec4\u0ec6\u0ec8-\u0ecd\u0ed0-\u0ed9\u0edc-\u0edf"},{name:"Latin",bmp:"A-Za-z\u00aa\u00ba\u00c0-\u00d6\u00d8-\u00f6\u00f8-\u02b8\u02e0-\u02e4\u1d00-\u1d25\u1d2c-\u1d5c\u1d62-\u1d65\u1d6b-\u1d77\u1d79-\u1dbe\u1e00-\u1eff\u2071\u207f\u2090-\u209c\u212a\u212b\u2132\u214e\u2160-\u2188\u2c60-\u2c7f\ua722-\ua787\ua78b-\ua78e\ua790-\ua793\ua7a0-\ua7aa\ua7f8-\ua7ff\ufb00-\ufb06\uff21-\uff3a\uff41-\uff5a"},{name:"Lepcha",bmp:"\u1c00-\u1c37\u1c3b-\u1c49\u1c4d-\u1c4f"},{name:"Limbu",bmp:"\u1900-\u191c\u1920-\u192b\u1930-\u193b\u1940\u1944-\u194f"},{name:"Linear_B",astral:"\ud800[\udc00-\udc0b\udc0d-\udc26\udc28-\udc3a\udc3c\udc3d\udc3f-\udc4d\udc50-\udc5d\udc80-\udcfa]"},{name:"Lisu",bmp:"\ua4d0-\ua4ff"},{name:"Lycian",astral:"\ud800[\ude80-\ude9c]"},{name:"Lydian",astral:"\ud802[\udd20-\udd39\udd3f]"},{name:"Malayalam",bmp:"\u0d02\u0d03\u0d05-\u0d0c\u0d0e-\u0d10\u0d12-\u0d3a\u0d3d-\u0d44\u0d46-\u0d48\u0d4a-\u0d4e\u0d57\u0d60-\u0d63\u0d66-\u0d75\u0d79-\u0d7f"},{name:"Mandaic",bmp:"\u0840-\u085b\u085e"},{name:"Meetei_Mayek",bmp:"\uaae0-\uaaf6\uabc0-\uabed\uabf0-\uabf9"},{name:"Meroitic_Cursive",astral:"\ud802[\udda0-\uddb7\uddbe\uddbf]"},{name:"Meroitic_Hieroglyphs",astral:"\ud802[\udd80-\udd9f]"},{name:"Miao",astral:"\ud81b[\udf00-\udf44\udf50-\udf7e\udf8f-\udf9f]"},{name:"Mongolian",bmp:"\u1800\u1801\u1804\u1806-\u180e\u1810-\u1819\u1820-\u1877\u1880-\u18aa"},{name:"Myanmar",bmp:"\u1000-\u109f\uaa60-\uaa7b"},{name:"New_Tai_Lue",bmp:"\u1980-\u19ab\u19b0-\u19c9\u19d0-\u19da\u19de\u19df"},{name:"Nko",bmp:"\u07c0-\u07fa"},{name:"Ogham",bmp:"\u1680-\u169c"},{name:"Ol_Chiki",bmp:"\u1c50-\u1c7f"},{name:"Old_Italic",astral:"\ud800[\udf00-\udf1e\udf20-\udf23]"},{name:"Old_Persian",astral:"\ud800[\udfa0-\udfc3\udfc8-\udfd5]"},{name:"Old_South_Arabian",astral:"\ud802[\ude60-\ude7f]"},{name:"Old_Turkic",astral:"\ud803[\udc00-\udc48]"},{name:"Oriya",bmp:"\u0b01-\u0b03\u0b05-\u0b0c\u0b0f\u0b10\u0b13-\u0b28\u0b2a-\u0b30\u0b32\u0b33\u0b35-\u0b39\u0b3c-\u0b44\u0b47\u0b48\u0b4b-\u0b4d\u0b56\u0b57\u0b5c\u0b5d\u0b5f-\u0b63\u0b66-\u0b77"},{name:"Osmanya",astral:"\ud801[\udc80-\udc9d\udca0-\udca9]"},{name:"Phags_Pa",bmp:"\ua840-\ua877"},{name:"Phoenician",astral:"\ud802[\udd00-\udd1b\udd1f]"},{name:"Rejang",bmp:"\ua930-\ua953\ua95f"},{name:"Runic",bmp:"\u16a0-\u16ea\u16ee-\u16f0"},{name:"Samaritan",bmp:"\u0800-\u082d\u0830-\u083e"},{name:"Saurashtra",bmp:"\ua880-\ua8c4\ua8ce-\ua8d9"},{name:"Sharada",astral:"\ud804[\udd80-\uddc8\uddd0-\uddd9]"},{name:"Shavian",astral:"\ud801[\udc50-\udc7f]"},{name:"Sinhala",bmp:"\u0d82\u0d83\u0d85-\u0d96\u0d9a-\u0db1\u0db3-\u0dbb\u0dbd\u0dc0-\u0dc6\u0dca\u0dcf-\u0dd4\u0dd6\u0dd8-\u0ddf\u0df2-\u0df4"},{name:"Sora_Sompeng",astral:"\ud804[\udcd0-\udce8\udcf0-\udcf9]"},{name:"Sundanese",bmp:"\u1b80-\u1bbf\u1cc0-\u1cc7"},{name:"Syloti_Nagri",bmp:"\ua800-\ua82b"},{name:"Syriac",bmp:"\u0700-\u070d\u070f-\u074a\u074d-\u074f"},{name:"Tagalog",bmp:"\u1700-\u170c\u170e-\u1714"},{name:"Tagbanwa",bmp:"\u1760-\u176c\u176e-\u1770\u1772\u1773"},{name:"Tai_Le",bmp:"\u1950-\u196d\u1970-\u1974"},{name:"Tai_Tham",bmp:"\u1a20-\u1a5e\u1a60-\u1a7c\u1a7f-\u1a89\u1a90-\u1a99\u1aa0-\u1aad"},{name:"Tai_Viet",bmp:"\uaa80-\uaac2\uaadb-\uaadf"},{name:"Takri",astral:"\ud805[\ude80-\udeb7\udec0-\udec9]"},{name:"Tamil",bmp:"\u0b82\u0b83\u0b85-\u0b8a\u0b8e-\u0b90\u0b92-\u0b95\u0b99\u0b9a\u0b9c\u0b9e\u0b9f\u0ba3\u0ba4\u0ba8-\u0baa\u0bae-\u0bb9\u0bbe-\u0bc2\u0bc6-\u0bc8\u0bca-\u0bcd\u0bd0\u0bd7\u0be6-\u0bfa"},{name:"Telugu",bmp:"\u0c01-\u0c03\u0c05-\u0c0c\u0c0e-\u0c10\u0c12-\u0c28\u0c2a-\u0c33\u0c35-\u0c39\u0c3d-\u0c44\u0c46-\u0c48\u0c4a-\u0c4d\u0c55\u0c56\u0c58\u0c59\u0c60-\u0c63\u0c66-\u0c6f\u0c78-\u0c7f"},{name:"Thaana",bmp:"\u0780-\u07b1"},{name:"Thai",bmp:"\u0e01-\u0e3a\u0e40-\u0e5b"},{name:"Tibetan",bmp:"\u0f00-\u0f47\u0f49-\u0f6c\u0f71-\u0f97\u0f99-\u0fbc\u0fbe-\u0fcc\u0fce-\u0fd4\u0fd9\u0fda"},{name:"Tifinagh",bmp:"\u2d30-\u2d67\u2d6f\u2d70\u2d7f"},{name:"Ugaritic",astral:"\ud800[\udf80-\udf9d\udf9f]"},{name:"Vai",bmp:"\ua500-\ua62b"},{name:"Yi",bmp:"\ua000-\ua48c\ua490-\ua4c6"}]);return g});
 
 
 
 
uninstall.php CHANGED
@@ -12,4 +12,24 @@ require(dirname(__FILE__) . '/config/config.php');
12
 
13
  /* Delete the record from database */
14
  delete_option(SQ_OPTION);
 
15
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
12
 
13
  /* Delete the record from database */
14
  delete_option(SQ_OPTION);
15
+ rrmdir(_SQ_CACHE_DIR_);
16
 
17
+ /**
18
+ * Remove the icon directory if exists
19
+ * @param string $dir
20
+ */
21
+ function rrmdir($dir) {
22
+ if (is_dir($dir)) {
23
+ $objects = scandir($dir);
24
+ foreach ($objects as $object) {
25
+ if ($object != "." && $object != "..") {
26
+ if (filetype($dir . "/" . $object) == "dir")
27
+ rrmdir($dir . "/" . $object);
28
+ else
29
+ unlink($dir . "/" . $object);
30
+ }
31
+ }
32
+ reset($objects);
33
+ @rmdir($dir);
34
+ }
35
+ }