xregexp-all-3.0.0-pre.js 208 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406340734083409341034113412341334143415341634173418341934203421342234233424342534263427342834293430343134323433343434353436343734383439344034413442344334443445344634473448344934503451345234533454345534563457345834593460346134623463346434653466346734683469347034713472347334743475347634773478347934803481348234833484348534863487348834893490349134923493349434953496349734983499350035013502350335043505350635073508350935103511351235133514351535163517351835193520352135223523352435253526352735283529353035313532353335343535353635373538353935403541354235433544354535463547354835493550355135523553355435553556355735583559356035613562356335643565356635673568356935703571357235733574357535763577357835793580358135823583358435853586358735883589359035913592359335943595359635973598359936003601360236033604360536063607360836093610361136123613361436153616361736183619362036213622362336243625362636273628362936303631363236333634363536363637363836393640364136423643364436453646364736483649365036513652365336543655365636573658365936603661366236633664366536663667366836693670367136723673367436753676367736783679368036813682368336843685368636873688368936903691369236933694369536963697369836993700370137023703370437053706370737083709371037113712371337143715371637173718371937203721372237233724372537263727372837293730373137323733373437353736373737383739374037413742374337443745374637473748374937503751375237533754375537563757375837593760376137623763376437653766376737683769377037713772377337743775377637773778377937803781378237833784378537863787378837893790379137923793379437953796379737983799380038013802380338043805380638073808380938103811381238133814381538163817381838193820382138223823382438253826382738283829383038313832383338343835383638373838383938403841384238433844384538463847384838493850385138523853385438553856385738583859386038613862386338643865386638673868386938703871387238733874387538763877387838793880388138823883388438853886388738883889389038913892389338943895389638973898389939003901390239033904390539063907390839093910391139123913391439153916391739183919392039213922392339243925392639273928392939303931393239333934393539363937393839393940394139423943394439453946394739483949395039513952395339543955395639573958395939603961396239633964396539663967396839693970397139723973397439753976397739783979398039813982398339843985398639873988398939903991399239933994399539963997399839994000400140024003400440054006400740084009401040114012401340144015401640174018401940204021402240234024402540264027402840294030403140324033403440354036403740384039404040414042404340444045404640474048404940504051405240534054405540564057405840594060406140624063406440654066406740684069407040714072407340744075407640774078407940804081408240834084408540864087408840894090409140924093409440954096409740984099410041014102410341044105410641074108410941104111411241134114411541164117411841194120412141224123412441254126412741284129413041314132413341344135413641374138413941404141414241434144414541464147414841494150415141524153415441554156415741584159416041614162416341644165416641674168416941704171417241734174417541764177417841794180418141824183418441854186418741884189419041914192419341944195419641974198419942004201420242034204420542064207420842094210421142124213421442154216421742184219422042214222422342244225422642274228422942304231423242334234423542364237423842394240424142424243424442454246424742484249425042514252425342544255
  1. /*
  2. @licstart The following is the entire license notice for the
  3. JavaScript code in this page.
  4. Steven Levithan (c) 2012-2015 MIT License http://xregexp.com/
  5. Permission is hereby granted, free of charge, to any person obtaining
  6. a copy of this software and associated documentation files (the
  7. "Software"), to deal in the Software without restriction, including
  8. without limitation the rights to use, copy, modify, merge, publish,
  9. distribute, sublicense, and/or sell copies of the Software, and to
  10. permit persons to whom the Software is furnished to do so, subject to
  11. the following conditions:
  12. The above copyright notice and this permission notice shall be included
  13. in all copies or substantial portions of the Software.
  14. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
  15. EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  16. MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
  17. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
  18. CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
  19. TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
  20. SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  21. @licend The above is the entire license notice
  22. for the JavaScript code in this page.
  23. */
  24. // Module systems magic dance. Don't use strict mode for this function, so it can assign to global.
  25. ;(function(root, definition) {
  26. var self;
  27. // RequireJS
  28. if (typeof define === 'function') {
  29. define(definition);
  30. // CommonJS
  31. } else if (typeof exports === 'object') {
  32. self = definition();
  33. // Use Node.js's `module.exports`. This supports both `require('xregexp')` and
  34. // `require('xregexp').XRegExp`
  35. (typeof module === 'object' ? (module.exports = self) : exports).XRegExp = self;
  36. // <script>
  37. } else {
  38. // Create global
  39. root.XRegExp = definition();
  40. }
  41. }(this, function() {
  42. /*!
  43. * XRegExp 3.0.0-pre
  44. * <http://xregexp.com/>
  45. * Steven Levithan (c) 2007-2015 MIT License
  46. */
  47. /**
  48. * XRegExp provides augmented, extensible regular expressions. You get additional regex syntax and
  49. * flags, beyond what browsers support natively. XRegExp is also a regex utility belt with tools
  50. * to make your client-side grepping simpler and more powerful, while freeing you from related
  51. * cross-browser inconsistencies.
  52. */
  53. var XRegExp = (function(undefined) {
  54. 'use strict';
  55. /* ==============================
  56. * Private variables
  57. * ============================== */
  58. var // Internal reference to the `XRegExp` object
  59. self,
  60. // Property name used for extended regex instance data
  61. REGEX_DATA = 'xregexp',
  62. // Optional features that can be installed and uninstalled
  63. features = {
  64. astral: false,
  65. natives: false
  66. },
  67. // Native methods to use and restore ('native' is an ES3 reserved keyword)
  68. nativ = {
  69. exec: RegExp.prototype.exec,
  70. test: RegExp.prototype.test,
  71. match: String.prototype.match,
  72. replace: String.prototype.replace,
  73. split: String.prototype.split
  74. },
  75. // Storage for fixed/extended native methods
  76. fixed = {},
  77. // Storage for regexes cached by `XRegExp.cache`
  78. regexCache = {},
  79. // Storage for pattern details cached by the `XRegExp` constructor
  80. patternCache = {},
  81. // Storage for regex syntax tokens added internally or by `XRegExp.addToken`
  82. tokens = [],
  83. // Token scopes
  84. defaultScope = 'default',
  85. classScope = 'class',
  86. // Regexes that match native regex syntax, including octals
  87. nativeTokens = {
  88. // Any native multicharacter token in default scope, or any single character
  89. '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]/,
  90. // Any native multicharacter token in character class scope, or any single character
  91. '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]/
  92. },
  93. // Any backreference or dollar-prefixed character in replacement strings
  94. replacementToken = /\$(?:{([\w$]+)}|(\d\d?|[\s\S]))/g,
  95. // Check for correct `exec` handling of nonparticipating capturing groups
  96. correctExecNpcg = nativ.exec.call(/()??/, '')[1] === undefined,
  97. // Check for flag y support
  98. hasNativeY = RegExp.prototype.sticky !== undefined,
  99. // Tracker for known flags, including addon flags
  100. registeredFlags = {
  101. g: true,
  102. i: true,
  103. m: true,
  104. y: hasNativeY
  105. },
  106. // Shortcut to `Object.prototype.toString`
  107. toString = {}.toString,
  108. // Shortcut to `XRegExp.addToken`
  109. add;
  110. /* ==============================
  111. * Private functions
  112. * ============================== */
  113. /**
  114. * Attaches named capture data and `XRegExp.prototype` properties to a regex object.
  115. *
  116. * @private
  117. * @param {RegExp} regex Regex to augment.
  118. * @param {Array} captureNames Array with capture names, or `null`.
  119. * @param {Boolean} [addProto=false] Whether to attach `XRegExp.prototype` properties. Not
  120. * attaching properties avoids a minor performance penalty.
  121. * @returns {RegExp} Augmented regex.
  122. */
  123. function augment(regex, captureNames, addProto) {
  124. var p;
  125. if (addProto) {
  126. // Can't auto-inherit these since the XRegExp constructor returns a nonprimitive value
  127. if (regex.__proto__) {
  128. regex.__proto__ = self.prototype;
  129. } else {
  130. for (p in self.prototype) {
  131. // A `self.prototype.hasOwnProperty(p)` check wouldn't be worth it here, since
  132. // this is performance sensitive, and enumerable `Object.prototype` or
  133. // `RegExp.prototype` extensions exist on `regex.prototype` anyway
  134. regex[p] = self.prototype[p];
  135. }
  136. }
  137. }
  138. regex[REGEX_DATA] = {captureNames: captureNames};
  139. return regex;
  140. }
  141. /**
  142. * Removes any duplicate characters from the provided string.
  143. *
  144. * @private
  145. * @param {String} str String to remove duplicate characters from.
  146. * @returns {String} String with any duplicate characters removed.
  147. */
  148. function clipDuplicates(str) {
  149. return nativ.replace.call(str, /([\s\S])(?=[\s\S]*\1)/g, '');
  150. }
  151. /**
  152. * Copies a regex object while preserving special properties for named capture and augmenting with
  153. * `XRegExp.prototype` methods. The copy has a fresh `lastIndex` property (set to zero). Allows
  154. * adding and removing native flags while copying the regex.
  155. *
  156. * @private
  157. * @param {RegExp} regex Regex to copy.
  158. * @param {Object} [options] Allows specifying native flags to add or remove while copying the
  159. * regex, and whether to attach `XRegExp.prototype` properties.
  160. * @returns {RegExp} Copy of the provided regex, possibly with modified flags.
  161. */
  162. function copy(regex, options) {
  163. if (!self.isRegExp(regex)) {
  164. throw new TypeError('Type RegExp expected');
  165. }
  166. // Get native flags in use
  167. var flags = nativ.exec.call(/\/([a-z]*)$/i, String(regex))[1];
  168. options = options || {};
  169. if (options.add) {
  170. flags = clipDuplicates(flags + options.add);
  171. }
  172. if (options.remove) {
  173. // Would need to escape `options.remove` if this was public
  174. flags = nativ.replace.call(flags, new RegExp('[' + options.remove + ']+', 'g'), '');
  175. }
  176. // Augment with `XRegExp.prototype` methods, but use the native `RegExp` constructor and
  177. // avoid searching for special tokens. That would be wrong for regexes constructed by
  178. // `RegExp`, and unnecessary for regexes constructed by `XRegExp` because the regex has
  179. // already undergone the translation to native regex syntax
  180. regex = augment(
  181. new RegExp(regex.source, flags),
  182. hasNamedCapture(regex) ? regex[REGEX_DATA].captureNames.slice(0) : null,
  183. options.addProto
  184. );
  185. return regex;
  186. }
  187. /**
  188. * Returns a new copy of the object used to hold extended regex instance data, tailored for a
  189. * native nonaugmented regex.
  190. *
  191. * @private
  192. * @returns {Object} Object with base regex instance data.
  193. */
  194. function getBaseProps() {
  195. return {captureNames: null};
  196. }
  197. /**
  198. * Determines whether a regex has extended instance data used to track capture names.
  199. *
  200. * @private
  201. * @param {RegExp} regex Regex to check.
  202. * @returns {Boolean} Whether the regex uses named capture.
  203. */
  204. function hasNamedCapture(regex) {
  205. return !!(regex[REGEX_DATA] && regex[REGEX_DATA].captureNames);
  206. }
  207. /**
  208. * Returns the first index at which a given value can be found in an array.
  209. *
  210. * @private
  211. * @param {Array} array Array to search.
  212. * @param {*} value Value to locate in the array.
  213. * @returns {Number} Zero-based index at which the item is found, or -1.
  214. */
  215. function indexOf(array, value) {
  216. var len = array.length, i;
  217. // Not a very good shim, but good enough for XRegExp's use of it
  218. for (i = 0; i < len; ++i) {
  219. if (array[i] === value) {
  220. return i;
  221. }
  222. }
  223. return -1;
  224. }
  225. /**
  226. * Determines whether a value is of the specified type, by resolving its internal [[Class]].
  227. *
  228. * @private
  229. * @param {*} value Object to check.
  230. * @param {String} type Type to check for, in TitleCase.
  231. * @returns {Boolean} Whether the object matches the type.
  232. */
  233. function isType(value, type) {
  234. return toString.call(value) === '[object ' + type + ']';
  235. }
  236. /**
  237. * Checks whether the next nonignorable token after the specified position is a quantifier.
  238. *
  239. * @private
  240. * @param {String} pattern Pattern to search within.
  241. * @param {Number} pos Index in `pattern` to search at.
  242. * @param {String} flags Flags used by the pattern.
  243. * @returns {Boolean} Whether the next token is a quantifier.
  244. */
  245. function isQuantifierNext(pattern, pos, flags) {
  246. return nativ.test.call(
  247. flags.indexOf('x') > -1 ?
  248. // Ignore any leading whitespace, line comments, and inline comments
  249. /^(?:\s+|#.*|\(\?#[^)]*\))*(?:[?*+]|{\d+(?:,\d*)?})/ :
  250. // Ignore any leading inline comments
  251. /^(?:\(\?#[^)]*\))*(?:[?*+]|{\d+(?:,\d*)?})/,
  252. pattern.slice(pos)
  253. );
  254. }
  255. /**
  256. * Checks for flag-related errors, and strips/applies flags in a leading mode modifier. Offloads
  257. * the flag preparation logic from the `XRegExp` constructor.
  258. *
  259. * @private
  260. * @param {String} pattern Regex pattern, possibly with a leading mode modifier.
  261. * @param {String} flags Any combination of flags.
  262. * @returns {Object} Object with properties `pattern` and `flags`.
  263. */
  264. function prepareFlags(pattern, flags) {
  265. var i;
  266. // Recent browsers throw on duplicate flags, so copy this behavior for nonnative flags
  267. if (clipDuplicates(flags) !== flags) {
  268. throw new SyntaxError('Invalid duplicate regex flag ' + flags);
  269. }
  270. // Strip and apply a leading mode modifier with any combination of flags except g or y
  271. pattern = nativ.replace.call(pattern, /^\(\?([\w$]+)\)/, function($0, $1) {
  272. if (nativ.test.call(/[gy]/, $1)) {
  273. throw new SyntaxError('Cannot use flag g or y in mode modifier ' + $0);
  274. }
  275. // Allow duplicate flags within the mode modifier
  276. flags = clipDuplicates(flags + $1);
  277. return '';
  278. });
  279. // Throw on unknown native or nonnative flags
  280. for (i = 0; i < flags.length; ++i) {
  281. if (!registeredFlags[flags.charAt(i)]) {
  282. throw new SyntaxError('Unknown regex flag ' + flags.charAt(i));
  283. }
  284. }
  285. return {
  286. pattern: pattern,
  287. flags: flags
  288. };
  289. }
  290. /**
  291. * Prepares an options object from the given value.
  292. *
  293. * @private
  294. * @param {String|Object} value Value to convert to an options object.
  295. * @returns {Object} Options object.
  296. */
  297. function prepareOptions(value) {
  298. var options = {};
  299. if (isType(value, 'String')) {
  300. self.forEach(value, /[^\s,]+/, function(match) {
  301. options[match] = true;
  302. });
  303. return options;
  304. }
  305. return value;
  306. }
  307. /**
  308. * Registers a flag so it doesn't throw an 'unknown flag' error.
  309. *
  310. * @private
  311. * @param {String} flag Single-character flag to register.
  312. */
  313. function registerFlag(flag) {
  314. if (!/^[\w$]$/.test(flag)) {
  315. throw new Error('Flag must be a single character A-Za-z0-9_$');
  316. }
  317. registeredFlags[flag] = true;
  318. }
  319. /**
  320. * Runs built-in and custom regex syntax tokens in reverse insertion order at the specified
  321. * position, until a match is found.
  322. *
  323. * @private
  324. * @param {String} pattern Original pattern from which an XRegExp object is being built.
  325. * @param {String} flags Flags being used to construct the regex.
  326. * @param {Number} pos Position to search for tokens within `pattern`.
  327. * @param {Number} scope Regex scope to apply: 'default' or 'class'.
  328. * @param {Object} context Context object to use for token handler functions.
  329. * @returns {Object} Object with properties `matchLength`, `output`, and `reparse`; or `null`.
  330. */
  331. function runTokens(pattern, flags, pos, scope, context) {
  332. var i = tokens.length,
  333. leadChar = pattern.charAt(pos),
  334. result = null,
  335. match,
  336. t;
  337. // Run in reverse insertion order
  338. while (i--) {
  339. t = tokens[i];
  340. if (
  341. (t.leadChar && t.leadChar !== leadChar) ||
  342. (t.scope !== scope && t.scope !== 'all') ||
  343. (t.flag && flags.indexOf(t.flag) === -1)
  344. ) {
  345. continue;
  346. }
  347. match = self.exec(pattern, t.regex, pos, 'sticky');
  348. if (match) {
  349. result = {
  350. matchLength: match[0].length,
  351. output: t.handler.call(context, match, scope, flags),
  352. reparse: t.reparse
  353. };
  354. // Finished with token tests
  355. break;
  356. }
  357. }
  358. return result;
  359. }
  360. /**
  361. * Enables or disables implicit astral mode opt-in.
  362. *
  363. * @private
  364. * @param {Boolean} on `true` to enable; `false` to disable.
  365. */
  366. function setAstral(on) {
  367. // Reset the pattern cache used by the `XRegExp` constructor, since the same pattern and
  368. // flags might now produce different results
  369. self.cache.flush('patterns');
  370. features.astral = on;
  371. }
  372. /**
  373. * Enables or disables native method overrides.
  374. *
  375. * @private
  376. * @param {Boolean} on `true` to enable; `false` to disable.
  377. */
  378. function setNatives(on) {
  379. RegExp.prototype.exec = (on ? fixed : nativ).exec;
  380. RegExp.prototype.test = (on ? fixed : nativ).test;
  381. String.prototype.match = (on ? fixed : nativ).match;
  382. String.prototype.replace = (on ? fixed : nativ).replace;
  383. String.prototype.split = (on ? fixed : nativ).split;
  384. features.natives = on;
  385. }
  386. /**
  387. * Returns the object, or throws an error if it is `null` or `undefined`. This is used to follow
  388. * the ES5 abstract operation `ToObject`.
  389. *
  390. * @private
  391. * @param {*} value Object to check and return.
  392. * @returns {*} The provided object.
  393. */
  394. function toObject(value) {
  395. // This matches both `null` and `undefined`
  396. if (value == null) {
  397. throw new TypeError('Cannot convert null or undefined to object');
  398. }
  399. return value;
  400. }
  401. /* ==============================
  402. * Constructor
  403. * ============================== */
  404. /**
  405. * Creates an extended regular expression object for matching text with a pattern. Differs from a
  406. * native regular expression in that additional syntax and flags are supported. The returned object
  407. * is in fact a native `RegExp` and works with all native methods.
  408. *
  409. * @class XRegExp
  410. * @constructor
  411. * @param {String|RegExp} pattern Regex pattern string, or an existing regex object to copy.
  412. * @param {String} [flags] Any combination of flags.
  413. * Native flags:
  414. * <li>`g` - global
  415. * <li>`i` - ignore case
  416. * <li>`m` - multiline anchors
  417. * <li>`y` - sticky (Firefox 3+, ES6)
  418. * Additional XRegExp flags:
  419. * <li>`n` - explicit capture
  420. * <li>`s` - dot matches all (aka singleline)
  421. * <li>`x` - free-spacing and line comments (aka extended)
  422. * <li>`A` - astral (requires the Unicode Base addon)
  423. * Flags cannot be provided when constructing one `RegExp` from another.
  424. * @returns {RegExp} Extended regular expression object.
  425. * @example
  426. *
  427. * // With named capture and flag x
  428. * XRegExp('(?<year> [0-9]{4} ) -? # year \n\
  429. * (?<month> [0-9]{2} ) -? # month \n\
  430. * (?<day> [0-9]{2} ) # day ', 'x');
  431. *
  432. * // Providing a regex object copies it. Native regexes are recompiled using native (not XRegExp)
  433. * // syntax. Copies maintain special properties for named capture, are augmented with
  434. * // `XRegExp.prototype` methods, and have fresh `lastIndex` properties (set to zero).
  435. * XRegExp(/regex/);
  436. */
  437. self = function(pattern, flags) {
  438. var context = {
  439. hasNamedCapture: false,
  440. captureNames: []
  441. },
  442. scope = defaultScope,
  443. output = '',
  444. pos = 0,
  445. result,
  446. token,
  447. generated,
  448. appliedPattern,
  449. appliedFlags;
  450. if (self.isRegExp(pattern)) {
  451. if (flags !== undefined) {
  452. throw new TypeError('Cannot supply flags when copying a RegExp');
  453. }
  454. return copy(pattern, {addProto: true});
  455. }
  456. // Copy the argument behavior of `RegExp`
  457. pattern = pattern === undefined ? '' : String(pattern);
  458. flags = flags === undefined ? '' : String(flags);
  459. if (!patternCache[pattern]) {
  460. patternCache[pattern] = {};
  461. }
  462. if (!patternCache[pattern][flags]) {
  463. // Check for flag-related errors, and strip/apply flags in a leading mode modifier
  464. result = prepareFlags(pattern, flags);
  465. appliedPattern = result.pattern;
  466. appliedFlags = result.flags;
  467. // Use XRegExp's tokens to translate the pattern to a native regex pattern.
  468. // `appliedPattern.length` may change on each iteration if tokens use `reparse`
  469. while (pos < appliedPattern.length) {
  470. do {
  471. // Check for custom tokens at the current position
  472. result = runTokens(appliedPattern, appliedFlags, pos, scope, context);
  473. // If the matched token used the `reparse` option, splice its output into the
  474. // pattern before running tokens again at the same position
  475. if (result && result.reparse) {
  476. appliedPattern = appliedPattern.slice(0, pos) +
  477. result.output +
  478. appliedPattern.slice(pos + result.matchLength);
  479. }
  480. } while (result && result.reparse);
  481. if (result) {
  482. output += result.output;
  483. pos += (result.matchLength || 1);
  484. } else {
  485. // Get the native token at the current position
  486. token = self.exec(appliedPattern, nativeTokens[scope], pos, 'sticky')[0];
  487. output += token;
  488. pos += token.length;
  489. if (token === '[' && scope === defaultScope) {
  490. scope = classScope;
  491. } else if (token === ']' && scope === classScope) {
  492. scope = defaultScope;
  493. }
  494. }
  495. }
  496. patternCache[pattern][flags] = {
  497. // Cleanup token cruft: repeated `(?:)(?:)` and leading/trailing `(?:)`
  498. pattern: nativ.replace.call(output, /\(\?:\)(?=\(\?:\))|^\(\?:\)|\(\?:\)$/g, ''),
  499. // Strip all but native flags
  500. flags: nativ.replace.call(appliedFlags, /[^gimy]+/g, ''),
  501. // `context.captureNames` has an item for each capturing group, even if unnamed
  502. captures: context.hasNamedCapture ? context.captureNames : null
  503. }
  504. }
  505. generated = patternCache[pattern][flags];
  506. return augment(
  507. new RegExp(generated.pattern, generated.flags),
  508. generated.captures,
  509. /*addProto*/ true
  510. );
  511. };
  512. // Add `RegExp.prototype` to the prototype chain
  513. self.prototype = new RegExp;
  514. /* ==============================
  515. * Public properties
  516. * ============================== */
  517. /**
  518. * The XRegExp version number.
  519. *
  520. * @static
  521. * @memberOf XRegExp
  522. * @type String
  523. */
  524. self.version = '3.0.0-pre';
  525. /* ==============================
  526. * Public methods
  527. * ============================== */
  528. /**
  529. * Extends XRegExp syntax and allows custom flags. This is used internally and can be used to
  530. * create XRegExp addons. If more than one token can match the same string, the last added wins.
  531. *
  532. * @memberOf XRegExp
  533. * @param {RegExp} regex Regex object that matches the new token.
  534. * @param {Function} handler Function that returns a new pattern string (using native regex syntax)
  535. * to replace the matched token within all future XRegExp regexes. Has access to persistent
  536. * properties of the regex being built, through `this`. Invoked with three arguments:
  537. * <li>The match array, with named backreference properties.
  538. * <li>The regex scope where the match was found: 'default' or 'class'.
  539. * <li>The flags used by the regex, including any flags in a leading mode modifier.
  540. * The handler function becomes part of the XRegExp construction process, so be careful not to
  541. * construct XRegExps within the function or you will trigger infinite recursion.
  542. * @param {Object} [options] Options object with optional properties:
  543. * <li>`scope` {String} Scope where the token applies: 'default', 'class', or 'all'.
  544. * <li>`flag` {String} Single-character flag that triggers the token. This also registers the
  545. * flag, which prevents XRegExp from throwing an 'unknown flag' error when the flag is used.
  546. * <li>`optionalFlags` {String} Any custom flags checked for within the token `handler` that are
  547. * not required to trigger the token. This registers the flags, to prevent XRegExp from
  548. * throwing an 'unknown flag' error when any of the flags are used.
  549. * <li>`reparse` {Boolean} Whether the `handler` function's output should not be treated as
  550. * final, and instead be reparseable by other tokens (including the current token). Allows
  551. * token chaining or deferring.
  552. * <li>`leadChar` {String} Single character that occurs at the beginning of any successful match
  553. * of the token (not always applicable). This doesn't change the behavior of the token unless
  554. * you provide an erroneous value. However, providing it can increase the token's performance.
  555. * @example
  556. *
  557. * // Basic usage: Add \a for the ALERT control code
  558. * XRegExp.addToken(
  559. * /\\a/,
  560. * function() {return '\\x07';},
  561. * {scope: 'all'}
  562. * );
  563. * XRegExp('\\a[\\a-\\n]+').test('\x07\n\x07'); // -> true
  564. *
  565. * // Add the U (ungreedy) flag from PCRE and RE2, which reverses greedy and lazy quantifiers
  566. * XRegExp.addToken(
  567. * /([?*+]|{\d+(?:,\d*)?})(\??)/,
  568. * function(match) {return match[1] + (match[2] ? '' : '?');},
  569. * {flag: 'U'}
  570. * );
  571. * XRegExp('a+', 'U').exec('aaa')[0]; // -> 'a'
  572. * XRegExp('a+?', 'U').exec('aaa')[0]; // -> 'aaa'
  573. */
  574. self.addToken = function(regex, handler, options) {
  575. options = options || {};
  576. var optionalFlags = options.optionalFlags, i;
  577. if (options.flag) {
  578. registerFlag(options.flag);
  579. }
  580. if (optionalFlags) {
  581. optionalFlags = nativ.split.call(optionalFlags, '');
  582. for (i = 0; i < optionalFlags.length; ++i) {
  583. registerFlag(optionalFlags[i]);
  584. }
  585. }
  586. // Add to the private list of syntax tokens
  587. tokens.push({
  588. regex: copy(regex, {add: 'g' + (hasNativeY ? 'y' : '')}),
  589. handler: handler,
  590. scope: options.scope || defaultScope,
  591. flag: options.flag,
  592. reparse: options.reparse,
  593. leadChar: options.leadChar
  594. });
  595. // Reset the pattern cache used by the `XRegExp` constructor, since the same pattern and
  596. // flags might now produce different results
  597. self.cache.flush('patterns');
  598. };
  599. /**
  600. * Caches and returns the result of calling `XRegExp(pattern, flags)`. On any subsequent call with
  601. * the same pattern and flag combination, the cached copy of the regex is returned.
  602. *
  603. * @memberOf XRegExp
  604. * @param {String} pattern Regex pattern string.
  605. * @param {String} [flags] Any combination of XRegExp flags.
  606. * @returns {RegExp} Cached XRegExp object.
  607. * @example
  608. *
  609. * while (match = XRegExp.cache('.', 'gs').exec(str)) {
  610. * // The regex is compiled once only
  611. * }
  612. */
  613. self.cache = function(pattern, flags) {
  614. if (!regexCache[pattern]) {
  615. regexCache[pattern] = {};
  616. }
  617. return regexCache[pattern][flags] || (
  618. regexCache[pattern][flags] = self(pattern, flags)
  619. );
  620. };
  621. // Intentionally undocumented
  622. self.cache.flush = function(cacheName) {
  623. if (cacheName === 'patterns') {
  624. // Flush the pattern cache used by the `XRegExp` constructor
  625. patternCache = {};
  626. } else {
  627. // Flush the regex cache populated by `XRegExp.cache`
  628. regexCache = {};
  629. }
  630. };
  631. /**
  632. * Escapes any regular expression metacharacters, for use when matching literal strings. The result
  633. * can safely be used at any point within a regex that uses any flags.
  634. *
  635. * @memberOf XRegExp
  636. * @param {String} str String to escape.
  637. * @returns {String} String with regex metacharacters escaped.
  638. * @example
  639. *
  640. * XRegExp.escape('Escaped? <.>');
  641. * // -> 'Escaped\?\ <\.>'
  642. */
  643. self.escape = function(str) {
  644. return nativ.replace.call(toObject(str), /[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&');
  645. };
  646. /**
  647. * Executes a regex search in a specified string. Returns a match array or `null`. If the provided
  648. * regex uses named capture, named backreference properties are included on the match array.
  649. * Optional `pos` and `sticky` arguments specify the search start position, and whether the match
  650. * must start at the specified position only. The `lastIndex` property of the provided regex is not
  651. * used, but is updated for compatibility. Also fixes browser bugs compared to the native
  652. * `RegExp.prototype.exec` and can be used reliably cross-browser.
  653. *
  654. * @memberOf XRegExp
  655. * @param {String} str String to search.
  656. * @param {RegExp} regex Regex to search with.
  657. * @param {Number} [pos=0] Zero-based index at which to start the search.
  658. * @param {Boolean|String} [sticky=false] Whether the match must start at the specified position
  659. * only. The string `'sticky'` is accepted as an alternative to `true`.
  660. * @returns {Array} Match array with named backreference properties, or `null`.
  661. * @example
  662. *
  663. * // Basic use, with named backreference
  664. * var match = XRegExp.exec('U+2620', XRegExp('U\\+(?<hex>[0-9A-F]{4})'));
  665. * match.hex; // -> '2620'
  666. *
  667. * // With pos and sticky, in a loop
  668. * var pos = 2, result = [], match;
  669. * while (match = XRegExp.exec('<1><2><3><4>5<6>', /<(\d)>/, pos, 'sticky')) {
  670. * result.push(match[1]);
  671. * pos = match.index + match[0].length;
  672. * }
  673. * // result -> ['2', '3', '4']
  674. */
  675. self.exec = function(str, regex, pos, sticky) {
  676. var cacheFlags = 'g', match, r2;
  677. if (hasNativeY && (sticky || (regex.sticky && sticky !== false))) {
  678. cacheFlags += 'y';
  679. }
  680. regex[REGEX_DATA] = regex[REGEX_DATA] || getBaseProps();
  681. // Shares cached copies with `XRegExp.match`/`replace`
  682. r2 = regex[REGEX_DATA][cacheFlags] || (
  683. regex[REGEX_DATA][cacheFlags] = copy(regex, {
  684. add: cacheFlags,
  685. remove: sticky === false ? 'y' : ''
  686. })
  687. );
  688. r2.lastIndex = pos = pos || 0;
  689. // Fixed `exec` required for `lastIndex` fix, named backreferences, etc.
  690. match = fixed.exec.call(r2, str);
  691. if (sticky && match && match.index !== pos) {
  692. match = null;
  693. }
  694. if (regex.global) {
  695. regex.lastIndex = match ? r2.lastIndex : 0;
  696. }
  697. return match;
  698. };
  699. /**
  700. * Executes a provided function once per regex match.
  701. *
  702. * @memberOf XRegExp
  703. * @param {String} str String to search.
  704. * @param {RegExp} regex Regex to search with.
  705. * @param {Function} callback Function to execute for each match. Invoked with four arguments:
  706. * <li>The match array, with named backreference properties.
  707. * <li>The zero-based match index.
  708. * <li>The string being traversed.
  709. * <li>The regex object being used to traverse the string.
  710. * @example
  711. *
  712. * // Extracts every other digit from a string
  713. * XRegExp.forEach('1a2345', /\d/, function(match, i) {
  714. * if (i % 2) this.push(+match[0]);
  715. * }, []);
  716. * // -> [2, 4]
  717. */
  718. self.forEach = function(str, regex, callback) {
  719. var pos = 0,
  720. i = -1,
  721. match;
  722. while ((match = self.exec(str, regex, pos))) {
  723. // Because `regex` is provided to `callback`, the function could use the deprecated/
  724. // nonstandard `RegExp.prototype.compile` to mutate the regex. However, since
  725. // `XRegExp.exec` doesn't use `lastIndex` to set the search position, this can't lead
  726. // to an infinite loop, at least. Actually, because of the way `XRegExp.exec` caches
  727. // globalized versions of regexes, mutating the regex will not have any effect on the
  728. // iteration or matched strings, which is a nice side effect that brings extra safety.
  729. callback(match, ++i, str, regex);
  730. pos = match.index + (match[0].length || 1);
  731. }
  732. };
  733. /**
  734. * Copies a regex object and adds flag `g`. The copy maintains special properties for named
  735. * capture, is augmented with `XRegExp.prototype` methods, and has a fresh `lastIndex` property
  736. * (set to zero). Native regexes are not recompiled using XRegExp syntax.
  737. *
  738. * @memberOf XRegExp
  739. * @param {RegExp} regex Regex to globalize.
  740. * @returns {RegExp} Copy of the provided regex with flag `g` added.
  741. * @example
  742. *
  743. * var globalCopy = XRegExp.globalize(/regex/);
  744. * globalCopy.global; // -> true
  745. */
  746. self.globalize = function(regex) {
  747. return copy(regex, {add: 'g', addProto: true});
  748. };
  749. /**
  750. * Installs optional features according to the specified options. Can be undone using
  751. * {@link #XRegExp.uninstall}.
  752. *
  753. * @memberOf XRegExp
  754. * @param {Object|String} options Options object or string.
  755. * @example
  756. *
  757. * // With an options object
  758. * XRegExp.install({
  759. * // Enables support for astral code points in Unicode addons (implicitly sets flag A)
  760. * astral: true,
  761. *
  762. * // Overrides native regex methods with fixed/extended versions that support named
  763. * // backreferences and fix numerous cross-browser bugs
  764. * natives: true
  765. * });
  766. *
  767. * // With an options string
  768. * XRegExp.install('astral natives');
  769. */
  770. self.install = function(options) {
  771. options = prepareOptions(options);
  772. if (!features.astral && options.astral) {
  773. setAstral(true);
  774. }
  775. if (!features.natives && options.natives) {
  776. setNatives(true);
  777. }
  778. };
  779. /**
  780. * Checks whether an individual optional feature is installed.
  781. *
  782. * @memberOf XRegExp
  783. * @param {String} feature Name of the feature to check. One of:
  784. * <li>`natives`
  785. * <li>`astral`
  786. * @returns {Boolean} Whether the feature is installed.
  787. * @example
  788. *
  789. * XRegExp.isInstalled('natives');
  790. */
  791. self.isInstalled = function(feature) {
  792. return !!(features[feature]);
  793. };
  794. /**
  795. * Returns `true` if an object is a regex; `false` if it isn't. This works correctly for regexes
  796. * created in another frame, when `instanceof` and `constructor` checks would fail.
  797. *
  798. * @memberOf XRegExp
  799. * @param {*} value Object to check.
  800. * @returns {Boolean} Whether the object is a `RegExp` object.
  801. * @example
  802. *
  803. * XRegExp.isRegExp('string'); // -> false
  804. * XRegExp.isRegExp(/regex/i); // -> true
  805. * XRegExp.isRegExp(RegExp('^', 'm')); // -> true
  806. * XRegExp.isRegExp(XRegExp('(?s).')); // -> true
  807. */
  808. self.isRegExp = function(value) {
  809. return toString.call(value) === '[object RegExp]';
  810. //return isType(value, 'RegExp');
  811. };
  812. /**
  813. * Returns the first matched string, or in global mode, an array containing all matched strings.
  814. * This is essentially a more convenient re-implementation of `String.prototype.match` that gives
  815. * the result types you actually want (string instead of `exec`-style array in match-first mode,
  816. * and an empty array instead of `null` when no matches are found in match-all mode). It also lets
  817. * you override flag g and ignore `lastIndex`, and fixes browser bugs.
  818. *
  819. * @memberOf XRegExp
  820. * @param {String} str String to search.
  821. * @param {RegExp} regex Regex to search with.
  822. * @param {String} [scope='one'] Use 'one' to return the first match as a string. Use 'all' to
  823. * return an array of all matched strings. If not explicitly specified and `regex` uses flag g,
  824. * `scope` is 'all'.
  825. * @returns {String|Array} In match-first mode: First match as a string, or `null`. In match-all
  826. * mode: Array of all matched strings, or an empty array.
  827. * @example
  828. *
  829. * // Match first
  830. * XRegExp.match('abc', /\w/); // -> 'a'
  831. * XRegExp.match('abc', /\w/g, 'one'); // -> 'a'
  832. * XRegExp.match('abc', /x/g, 'one'); // -> null
  833. *
  834. * // Match all
  835. * XRegExp.match('abc', /\w/g); // -> ['a', 'b', 'c']
  836. * XRegExp.match('abc', /\w/, 'all'); // -> ['a', 'b', 'c']
  837. * XRegExp.match('abc', /x/, 'all'); // -> []
  838. */
  839. self.match = function(str, regex, scope) {
  840. var global = (regex.global && scope !== 'one') || scope === 'all',
  841. cacheFlags = (global ? 'g' : '') + (regex.sticky ? 'y' : ''),
  842. result,
  843. r2;
  844. regex[REGEX_DATA] = regex[REGEX_DATA] || getBaseProps();
  845. // Shares cached copies with `XRegExp.exec`/`replace`
  846. r2 = regex[REGEX_DATA][cacheFlags || 'noGY'] || (
  847. regex[REGEX_DATA][cacheFlags || 'noGY'] = copy(regex, {
  848. add: cacheFlags,
  849. remove: scope === 'one' ? 'g' : ''
  850. })
  851. );
  852. result = nativ.match.call(toObject(str), r2);
  853. if (regex.global) {
  854. regex.lastIndex = (
  855. (scope === 'one' && result) ?
  856. // Can't use `r2.lastIndex` since `r2` is nonglobal in this case
  857. (result.index + result[0].length) : 0
  858. );
  859. }
  860. return global ? (result || []) : (result && result[0]);
  861. };
  862. /**
  863. * Retrieves the matches from searching a string using a chain of regexes that successively search
  864. * within previous matches. The provided `chain` array can contain regexes and objects with `regex`
  865. * and `backref` properties. When a backreference is specified, the named or numbered backreference
  866. * is passed forward to the next regex or returned.
  867. *
  868. * @memberOf XRegExp
  869. * @param {String} str String to search.
  870. * @param {Array} chain Regexes that each search for matches within preceding results.
  871. * @returns {Array} Matches by the last regex in the chain, or an empty array.
  872. * @example
  873. *
  874. * // Basic usage; matches numbers within <b> tags
  875. * XRegExp.matchChain('1 <b>2</b> 3 <b>4 a 56</b>', [
  876. * XRegExp('(?is)<b>.*?</b>'),
  877. * /\d+/
  878. * ]);
  879. * // -> ['2', '4', '56']
  880. *
  881. * // Passing forward and returning specific backreferences
  882. * html = '<a href="http://xregexp.com/api/">XRegExp</a>\
  883. * <a href="http://www.google.com/">Google</a>';
  884. * XRegExp.matchChain(html, [
  885. * {regex: /<a href="([^"]+)">/i, backref: 1},
  886. * {regex: XRegExp('(?i)^https?://(?<domain>[^/?#]+)'), backref: 'domain'}
  887. * ]);
  888. * // -> ['xregexp.com', 'www.google.com']
  889. */
  890. self.matchChain = function(str, chain) {
  891. return (function recurseChain(values, level) {
  892. var item = chain[level].regex ? chain[level] : {regex: chain[level]},
  893. matches = [],
  894. addMatch = function(match) {
  895. if (item.backref) {
  896. /* Safari 4.0.5 (but not 5.0.5+) inappropriately uses sparse arrays to hold
  897. * the `undefined`s for backreferences to nonparticipating capturing
  898. * groups. In such cases, a `hasOwnProperty` or `in` check on its own would
  899. * inappropriately throw the exception, so also check if the backreference
  900. * is a number that is within the bounds of the array.
  901. */
  902. if (!(match.hasOwnProperty(item.backref) || +item.backref < match.length)) {
  903. throw new ReferenceError('Backreference to undefined group: ' + item.backref);
  904. }
  905. matches.push(match[item.backref] || '');
  906. } else {
  907. matches.push(match[0]);
  908. }
  909. },
  910. i;
  911. for (i = 0; i < values.length; ++i) {
  912. self.forEach(values[i], item.regex, addMatch);
  913. }
  914. return ((level === chain.length - 1) || !matches.length) ?
  915. matches :
  916. recurseChain(matches, level + 1);
  917. }([str], 0));
  918. };
  919. /**
  920. * Returns a new string with one or all matches of a pattern replaced. The pattern can be a string
  921. * or regex, and the replacement can be a string or a function to be called for each match. To
  922. * perform a global search and replace, use the optional `scope` argument or include flag g if
  923. * using a regex. Replacement strings can use `${n}` for named and numbered backreferences.
  924. * Replacement functions can use named backreferences via `arguments[0].name`. Also fixes browser
  925. * bugs compared to the native `String.prototype.replace` and can be used reliably cross-browser.
  926. *
  927. * @memberOf XRegExp
  928. * @param {String} str String to search.
  929. * @param {RegExp|String} search Search pattern to be replaced.
  930. * @param {String|Function} replacement Replacement string or a function invoked to create it.
  931. * Replacement strings can include special replacement syntax:
  932. * <li>$$ - Inserts a literal $ character.
  933. * <li>$&, $0 - Inserts the matched substring.
  934. * <li>$` - Inserts the string that precedes the matched substring (left context).
  935. * <li>$' - Inserts the string that follows the matched substring (right context).
  936. * <li>$n, $nn - Where n/nn are digits referencing an existent capturing group, inserts
  937. * backreference n/nn.
  938. * <li>${n} - Where n is a name or any number of digits that reference an existent capturing
  939. * group, inserts backreference n.
  940. * Replacement functions are invoked with three or more arguments:
  941. * <li>The matched substring (corresponds to $& above). Named backreferences are accessible as
  942. * properties of this first argument.
  943. * <li>0..n arguments, one for each backreference (corresponding to $1, $2, etc. above).
  944. * <li>The zero-based index of the match within the total search string.
  945. * <li>The total string being searched.
  946. * @param {String} [scope='one'] Use 'one' to replace the first match only, or 'all'. If not
  947. * explicitly specified and using a regex with flag g, `scope` is 'all'.
  948. * @returns {String} New string with one or all matches replaced.
  949. * @example
  950. *
  951. * // Regex search, using named backreferences in replacement string
  952. * var name = XRegExp('(?<first>\\w+) (?<last>\\w+)');
  953. * XRegExp.replace('John Smith', name, '${last}, ${first}');
  954. * // -> 'Smith, John'
  955. *
  956. * // Regex search, using named backreferences in replacement function
  957. * XRegExp.replace('John Smith', name, function(match) {
  958. * return match.last + ', ' + match.first;
  959. * });
  960. * // -> 'Smith, John'
  961. *
  962. * // String search, with replace-all
  963. * XRegExp.replace('RegExp builds RegExps', 'RegExp', 'XRegExp', 'all');
  964. * // -> 'XRegExp builds XRegExps'
  965. */
  966. self.replace = function(str, search, replacement, scope) {
  967. var isRegex = self.isRegExp(search),
  968. global = (search.global && scope !== 'one') || scope === 'all',
  969. cacheFlags = (global ? 'g' : '') + (search.sticky ? 'y' : ''),
  970. s2 = search,
  971. result;
  972. if (isRegex) {
  973. search[REGEX_DATA] = search[REGEX_DATA] || getBaseProps();
  974. // Shares cached copies with `XRegExp.exec`/`match`. Since a copy is used,
  975. // `search`'s `lastIndex` isn't updated *during* replacement iterations
  976. s2 = search[REGEX_DATA][cacheFlags || 'noGY'] || (
  977. search[REGEX_DATA][cacheFlags || 'noGY'] = copy(search, {
  978. add: cacheFlags,
  979. remove: scope === 'one' ? 'g' : ''
  980. })
  981. );
  982. } else if (global) {
  983. s2 = new RegExp(self.escape(String(search)), 'g');
  984. }
  985. // Fixed `replace` required for named backreferences, etc.
  986. result = fixed.replace.call(toObject(str), s2, replacement);
  987. if (isRegex && search.global) {
  988. // Fixes IE, Safari bug (last tested IE 9, Safari 5.1)
  989. search.lastIndex = 0;
  990. }
  991. return result;
  992. };
  993. /**
  994. * Performs batch processing of string replacements. Used like {@link #XRegExp.replace}, but
  995. * accepts an array of replacement details. Later replacements operate on the output of earlier
  996. * replacements. Replacement details are accepted as an array with a regex or string to search for,
  997. * the replacement string or function, and an optional scope of 'one' or 'all'. Uses the XRegExp
  998. * replacement text syntax, which supports named backreference properties via `${name}`.
  999. *
  1000. * @memberOf XRegExp
  1001. * @param {String} str String to search.
  1002. * @param {Array} replacements Array of replacement detail arrays.
  1003. * @returns {String} New string with all replacements.
  1004. * @example
  1005. *
  1006. * str = XRegExp.replaceEach(str, [
  1007. * [XRegExp('(?<name>a)'), 'z${name}'],
  1008. * [/b/gi, 'y'],
  1009. * [/c/g, 'x', 'one'], // scope 'one' overrides /g
  1010. * [/d/, 'w', 'all'], // scope 'all' overrides lack of /g
  1011. * ['e', 'v', 'all'], // scope 'all' allows replace-all for strings
  1012. * [/f/g, function($0) {
  1013. * return $0.toUpperCase();
  1014. * }]
  1015. * ]);
  1016. */
  1017. self.replaceEach = function(str, replacements) {
  1018. var i, r;
  1019. for (i = 0; i < replacements.length; ++i) {
  1020. r = replacements[i];
  1021. str = self.replace(str, r[0], r[1], r[2]);
  1022. }
  1023. return str;
  1024. };
  1025. /**
  1026. * Splits a string into an array of strings using a regex or string separator. Matches of the
  1027. * separator are not included in the result array. However, if `separator` is a regex that contains
  1028. * capturing groups, backreferences are spliced into the result each time `separator` is matched.
  1029. * Fixes browser bugs compared to the native `String.prototype.split` and can be used reliably
  1030. * cross-browser.
  1031. *
  1032. * @memberOf XRegExp
  1033. * @param {String} str String to split.
  1034. * @param {RegExp|String} separator Regex or string to use for separating the string.
  1035. * @param {Number} [limit] Maximum number of items to include in the result array.
  1036. * @returns {Array} Array of substrings.
  1037. * @example
  1038. *
  1039. * // Basic use
  1040. * XRegExp.split('a b c', ' ');
  1041. * // -> ['a', 'b', 'c']
  1042. *
  1043. * // With limit
  1044. * XRegExp.split('a b c', ' ', 2);
  1045. * // -> ['a', 'b']
  1046. *
  1047. * // Backreferences in result array
  1048. * XRegExp.split('..word1..', /([a-z]+)(\d+)/i);
  1049. * // -> ['..', 'word', '1', '..']
  1050. */
  1051. self.split = function(str, separator, limit) {
  1052. return fixed.split.call(toObject(str), separator, limit);
  1053. };
  1054. /**
  1055. * Executes a regex search in a specified string. Returns `true` or `false`. Optional `pos` and
  1056. * `sticky` arguments specify the search start position, and whether the match must start at the
  1057. * specified position only. The `lastIndex` property of the provided regex is not used, but is
  1058. * updated for compatibility. Also fixes browser bugs compared to the native
  1059. * `RegExp.prototype.test` and can be used reliably cross-browser.
  1060. *
  1061. * @memberOf XRegExp
  1062. * @param {String} str String to search.
  1063. * @param {RegExp} regex Regex to search with.
  1064. * @param {Number} [pos=0] Zero-based index at which to start the search.
  1065. * @param {Boolean|String} [sticky=false] Whether the match must start at the specified position
  1066. * only. The string `'sticky'` is accepted as an alternative to `true`.
  1067. * @returns {Boolean} Whether the regex matched the provided value.
  1068. * @example
  1069. *
  1070. * // Basic use
  1071. * XRegExp.test('abc', /c/); // -> true
  1072. *
  1073. * // With pos and sticky
  1074. * XRegExp.test('abc', /c/, 0, 'sticky'); // -> false
  1075. */
  1076. self.test = function(str, regex, pos, sticky) {
  1077. // Do this the easy way :-)
  1078. return !!self.exec(str, regex, pos, sticky);
  1079. };
  1080. /**
  1081. * Uninstalls optional features according to the specified options. All optional features start out
  1082. * uninstalled, so this is used to undo the actions of {@link #XRegExp.install}.
  1083. *
  1084. * @memberOf XRegExp
  1085. * @param {Object|String} options Options object or string.
  1086. * @example
  1087. *
  1088. * // With an options object
  1089. * XRegExp.uninstall({
  1090. * // Disables support for astral code points in Unicode addons
  1091. * astral: true,
  1092. *
  1093. * // Restores native regex methods
  1094. * natives: true
  1095. * });
  1096. *
  1097. * // With an options string
  1098. * XRegExp.uninstall('astral natives');
  1099. */
  1100. self.uninstall = function(options) {
  1101. options = prepareOptions(options);
  1102. if (features.astral && options.astral) {
  1103. setAstral(false);
  1104. }
  1105. if (features.natives && options.natives) {
  1106. setNatives(false);
  1107. }
  1108. };
  1109. /**
  1110. * Returns an XRegExp object that is the union of the given patterns. Patterns can be provided as
  1111. * regex objects or strings. Metacharacters are escaped in patterns provided as strings.
  1112. * Backreferences in provided regex objects are automatically renumbered to work correctly within
  1113. * the larger combined pattern. Native flags used by provided regexes are ignored in favor of the
  1114. * `flags` argument.
  1115. *
  1116. * @memberOf XRegExp
  1117. * @param {Array} patterns Regexes and strings to combine.
  1118. * @param {String} [flags] Any combination of XRegExp flags.
  1119. * @returns {RegExp} Union of the provided regexes and strings.
  1120. * @example
  1121. *
  1122. * XRegExp.union(['a+b*c', /(dogs)\1/, /(cats)\1/], 'i');
  1123. * // -> /a\+b\*c|(dogs)\1|(cats)\2/i
  1124. */
  1125. self.union = function(patterns, flags) {
  1126. var parts = /(\()(?!\?)|\\([1-9]\d*)|\\[\s\S]|\[(?:[^\\\]]|\\[\s\S])*]/g,
  1127. output = [],
  1128. numCaptures = 0,
  1129. numPriorCaptures,
  1130. captureNames,
  1131. pattern,
  1132. rewrite = function(match, paren, backref) {
  1133. var name = captureNames[numCaptures - numPriorCaptures];
  1134. // Capturing group
  1135. if (paren) {
  1136. ++numCaptures;
  1137. // If the current capture has a name, preserve the name
  1138. if (name) {
  1139. return '(?<' + name + '>';
  1140. }
  1141. // Backreference
  1142. } else if (backref) {
  1143. // Rewrite the backreference
  1144. return '\\' + (+backref + numPriorCaptures);
  1145. }
  1146. return match;
  1147. },
  1148. i;
  1149. if (!(isType(patterns, 'Array') && patterns.length)) {
  1150. throw new TypeError('Must provide a nonempty array of patterns to merge');
  1151. }
  1152. for (i = 0; i < patterns.length; ++i) {
  1153. pattern = patterns[i];
  1154. if (self.isRegExp(pattern)) {
  1155. numPriorCaptures = numCaptures;
  1156. captureNames = (pattern[REGEX_DATA] && pattern[REGEX_DATA].captureNames) || [];
  1157. // Rewrite backreferences. Passing to XRegExp dies on octals and ensures patterns
  1158. // are independently valid; helps keep this simple. Named captures are put back
  1159. output.push(nativ.replace.call(self(pattern.source).source, parts, rewrite));
  1160. } else {
  1161. output.push(self.escape(pattern));
  1162. }
  1163. }
  1164. return self(output.join('|'), flags);
  1165. };
  1166. /* ==============================
  1167. * Fixed/extended native methods
  1168. * ============================== */
  1169. /**
  1170. * Adds named capture support (with backreferences returned as `result.name`), and fixes browser
  1171. * bugs in the native `RegExp.prototype.exec`. Calling `XRegExp.install('natives')` uses this to
  1172. * override the native method. Use via `XRegExp.exec` without overriding natives.
  1173. *
  1174. * @private
  1175. * @param {String} str String to search.
  1176. * @returns {Array} Match array with named backreference properties, or `null`.
  1177. */
  1178. fixed.exec = function(str) {
  1179. var origLastIndex = this.lastIndex,
  1180. match = nativ.exec.apply(this, arguments),
  1181. name,
  1182. r2,
  1183. i;
  1184. if (match) {
  1185. // Fix browsers whose `exec` methods don't return `undefined` for nonparticipating
  1186. // capturing groups. This fixes IE 5.5-8, but not IE 9's quirks mode or emulation of
  1187. // older IEs. IE 9 in standards mode follows the spec
  1188. if (!correctExecNpcg && match.length > 1 && indexOf(match, '') > -1) {
  1189. r2 = copy(this, {remove: 'g'});
  1190. // Using `str.slice(match.index)` rather than `match[0]` in case lookahead allowed
  1191. // matching due to characters outside the match
  1192. nativ.replace.call(String(str).slice(match.index), r2, function() {
  1193. var len = arguments.length, i;
  1194. // Skip index 0 and the last 2
  1195. for (i = 1; i < len - 2; ++i) {
  1196. if (arguments[i] === undefined) {
  1197. match[i] = undefined;
  1198. }
  1199. }
  1200. });
  1201. }
  1202. // Attach named capture properties
  1203. if (this[REGEX_DATA] && this[REGEX_DATA].captureNames) {
  1204. // Skip index 0
  1205. for (i = 1; i < match.length; ++i) {
  1206. name = this[REGEX_DATA].captureNames[i - 1];
  1207. if (name) {
  1208. match[name] = match[i];
  1209. }
  1210. }
  1211. }
  1212. // Fix browsers that increment `lastIndex` after zero-length matches
  1213. if (this.global && !match[0].length && (this.lastIndex > match.index)) {
  1214. this.lastIndex = match.index;
  1215. }
  1216. }
  1217. if (!this.global) {
  1218. // Fixes IE, Opera bug (last tested IE 9, Opera 11.6)
  1219. this.lastIndex = origLastIndex;
  1220. }
  1221. return match;
  1222. };
  1223. /**
  1224. * Fixes browser bugs in the native `RegExp.prototype.test`. Calling `XRegExp.install('natives')`
  1225. * uses this to override the native method.
  1226. *
  1227. * @private
  1228. * @param {String} str String to search.
  1229. * @returns {Boolean} Whether the regex matched the provided value.
  1230. */
  1231. fixed.test = function(str) {
  1232. // Do this the easy way :-)
  1233. return !!fixed.exec.call(this, str);
  1234. };
  1235. /**
  1236. * Adds named capture support (with backreferences returned as `result.name`), and fixes browser
  1237. * bugs in the native `String.prototype.match`. Calling `XRegExp.install('natives')` uses this to
  1238. * override the native method.
  1239. *
  1240. * @private
  1241. * @param {RegExp|*} regex Regex to search with. If not a regex object, it is passed to `RegExp`.
  1242. * @returns {Array} If `regex` uses flag g, an array of match strings or `null`. Without flag g,
  1243. * the result of calling `regex.exec(this)`.
  1244. */
  1245. fixed.match = function(regex) {
  1246. var result;
  1247. if (!self.isRegExp(regex)) {
  1248. // Use the native `RegExp` rather than `XRegExp`
  1249. regex = new RegExp(regex);
  1250. } else if (regex.global) {
  1251. result = nativ.match.apply(this, arguments);
  1252. // Fixes IE bug
  1253. regex.lastIndex = 0;
  1254. return result;
  1255. }
  1256. return fixed.exec.call(regex, toObject(this));
  1257. };
  1258. /**
  1259. * Adds support for `${n}` tokens for named and numbered backreferences in replacement text, and
  1260. * provides named backreferences to replacement functions as `arguments[0].name`. Also fixes
  1261. * browser bugs in replacement text syntax when performing a replacement using a nonregex search
  1262. * value, and the value of a replacement regex's `lastIndex` property during replacement iterations
  1263. * and upon completion. Note that this doesn't support SpiderMonkey's proprietary third (`flags`)
  1264. * argument. Calling `XRegExp.install('natives')` uses this to override the native method. Use via
  1265. * `XRegExp.replace` without overriding natives.
  1266. *
  1267. * @private
  1268. * @param {RegExp|String} search Search pattern to be replaced.
  1269. * @param {String|Function} replacement Replacement string or a function invoked to create it.
  1270. * @returns {String} New string with one or all matches replaced.
  1271. */
  1272. fixed.replace = function(search, replacement) {
  1273. var isRegex = self.isRegExp(search),
  1274. origLastIndex,
  1275. captureNames,
  1276. result;
  1277. if (isRegex) {
  1278. if (search[REGEX_DATA]) {
  1279. captureNames = search[REGEX_DATA].captureNames;
  1280. }
  1281. // Only needed if `search` is nonglobal
  1282. origLastIndex = search.lastIndex;
  1283. } else {
  1284. search += ''; // Type-convert
  1285. }
  1286. // Don't use `typeof`; some older browsers return 'function' for regex objects
  1287. if (isType(replacement, 'Function')) {
  1288. // Stringifying `this` fixes a bug in IE < 9 where the last argument in replacement
  1289. // functions isn't type-converted to a string
  1290. result = nativ.replace.call(String(this), search, function() {
  1291. var args = arguments, i;
  1292. if (captureNames) {
  1293. // Change the `arguments[0]` string primitive to a `String` object that can
  1294. // store properties. This really does need to use `String` as a constructor
  1295. args[0] = new String(args[0]);
  1296. // Store named backreferences on the first argument
  1297. for (i = 0; i < captureNames.length; ++i) {
  1298. if (captureNames[i]) {
  1299. args[0][captureNames[i]] = args[i + 1];
  1300. }
  1301. }
  1302. }
  1303. // Update `lastIndex` before calling `replacement`. Fixes IE, Chrome, Firefox,
  1304. // Safari bug (last tested IE 9, Chrome 17, Firefox 11, Safari 5.1)
  1305. if (isRegex && search.global) {
  1306. search.lastIndex = args[args.length - 2] + args[0].length;
  1307. }
  1308. // ES6 specs the context for replacement functions as `undefined`
  1309. return replacement.apply(undefined, args);
  1310. });
  1311. } else {
  1312. // Ensure that the last value of `args` will be a string when given nonstring `this`,
  1313. // while still throwing on `null` or `undefined` context
  1314. result = nativ.replace.call(this == null ? this : String(this), search, function() {
  1315. // Keep this function's `arguments` available through closure
  1316. var args = arguments;
  1317. return nativ.replace.call(String(replacement), replacementToken, function($0, $1, $2) {
  1318. var n;
  1319. // Named or numbered backreference with curly braces
  1320. if ($1) {
  1321. // XRegExp behavior for `${n}`:
  1322. // 1. Backreference to numbered capture, if `n` is an integer. Use `0` for
  1323. // for the entire match. Any number of leading zeros may be used.
  1324. // 2. Backreference to named capture `n`, if it exists and is not an
  1325. // integer overridden by numbered capture. In practice, this does not
  1326. // overlap with numbered capture since XRegExp does not allow named
  1327. // capture to use a bare integer as the name.
  1328. // 3. If the name or number does not refer to an existing capturing group,
  1329. // it's an error.
  1330. n = +$1; // Type-convert; drop leading zeros
  1331. if (n <= args.length - 3) {
  1332. return args[n] || '';
  1333. }
  1334. // Groups with the same name is an error, else would need `lastIndexOf`
  1335. n = captureNames ? indexOf(captureNames, $1) : -1;
  1336. if (n < 0) {
  1337. throw new SyntaxError('Backreference to undefined group ' + $0);
  1338. }
  1339. return args[n + 1] || '';
  1340. }
  1341. // Else, special variable or numbered backreference without curly braces
  1342. if ($2 === '$') { // $$
  1343. return '$';
  1344. }
  1345. if ($2 === '&' || +$2 === 0) { // $&, $0 (not followed by 1-9), $00
  1346. return args[0];
  1347. }
  1348. if ($2 === '`') { // $` (left context)
  1349. return args[args.length - 1].slice(0, args[args.length - 2]);
  1350. }
  1351. if ($2 === "'") { // $' (right context)
  1352. return args[args.length - 1].slice(args[args.length - 2] + args[0].length);
  1353. }
  1354. // Else, numbered backreference without curly braces
  1355. $2 = +$2; // Type-convert; drop leading zero
  1356. // XRegExp behavior for `$n` and `$nn`:
  1357. // - Backrefs end after 1 or 2 digits. Use `${..}` for more digits.
  1358. // - `$1` is an error if no capturing groups.
  1359. // - `$10` is an error if less than 10 capturing groups. Use `${1}0` instead.
  1360. // - `$01` is `$1` if at least one capturing group, else it's an error.
  1361. // - `$0` (not followed by 1-9) and `$00` are the entire match.
  1362. // Native behavior, for comparison:
  1363. // - Backrefs end after 1 or 2 digits. Cannot reference capturing group 100+.
  1364. // - `$1` is a literal `$1` if no capturing groups.
  1365. // - `$10` is `$1` followed by a literal `0` if less than 10 capturing groups.
  1366. // - `$01` is `$1` if at least one capturing group, else it's a literal `$01`.
  1367. // - `$0` is a literal `$0`.
  1368. if (!isNaN($2)) {
  1369. if ($2 > args.length - 3) {
  1370. throw new SyntaxError('Backreference to undefined group ' + $0);
  1371. }
  1372. return args[$2] || '';
  1373. }
  1374. throw new SyntaxError('Invalid token ' + $0);
  1375. });
  1376. });
  1377. }
  1378. if (isRegex) {
  1379. if (search.global) {
  1380. // Fixes IE, Safari bug (last tested IE 9, Safari 5.1)
  1381. search.lastIndex = 0;
  1382. } else {
  1383. // Fixes IE, Opera bug (last tested IE 9, Opera 11.6)
  1384. search.lastIndex = origLastIndex;
  1385. }
  1386. }
  1387. return result;
  1388. };
  1389. /**
  1390. * Fixes browser bugs in the native `String.prototype.split`. Calling `XRegExp.install('natives')`
  1391. * uses this to override the native method. Use via `XRegExp.split` without overriding natives.
  1392. *
  1393. * @private
  1394. * @param {RegExp|String} separator Regex or string to use for separating the string.
  1395. * @param {Number} [limit] Maximum number of items to include in the result array.
  1396. * @returns {Array} Array of substrings.
  1397. */
  1398. fixed.split = function(separator, limit) {
  1399. if (!self.isRegExp(separator)) {
  1400. // Browsers handle nonregex split correctly, so use the faster native method
  1401. return nativ.split.apply(this, arguments);
  1402. }
  1403. var str = String(this),
  1404. output = [],
  1405. origLastIndex = separator.lastIndex,
  1406. lastLastIndex = 0,
  1407. lastLength;
  1408. // Values for `limit`, per the spec:
  1409. // If undefined: pow(2,32) - 1
  1410. // If 0, Infinity, or NaN: 0
  1411. // If positive number: limit = floor(limit); if (limit >= pow(2,32)) limit -= pow(2,32);
  1412. // If negative number: pow(2,32) - floor(abs(limit))
  1413. // If other: Type-convert, then use the above rules
  1414. // This line fails in very strange ways for some values of `limit` in Opera 10.5-10.63,
  1415. // unless Opera Dragonfly is open (go figure). It works in at least Opera 9.5-10.1 and 11+
  1416. limit = (limit === undefined ? -1 : limit) >>> 0;
  1417. self.forEach(str, separator, function(match) {
  1418. // This condition is not the same as `if (match[0].length)`
  1419. if ((match.index + match[0].length) > lastLastIndex) {
  1420. output.push(str.slice(lastLastIndex, match.index));
  1421. if (match.length > 1 && match.index < str.length) {
  1422. Array.prototype.push.apply(output, match.slice(1));
  1423. }
  1424. lastLength = match[0].length;
  1425. lastLastIndex = match.index + lastLength;
  1426. }
  1427. });
  1428. if (lastLastIndex === str.length) {
  1429. if (!nativ.test.call(separator, '') || lastLength) {
  1430. output.push('');
  1431. }
  1432. } else {
  1433. output.push(str.slice(lastLastIndex));
  1434. }
  1435. separator.lastIndex = origLastIndex;
  1436. return output.length > limit ? output.slice(0, limit) : output;
  1437. };
  1438. /* ==============================
  1439. * Built-in syntax/flag tokens
  1440. * ============================== */
  1441. add = self.addToken;
  1442. /*
  1443. * Letter identity escapes that natively match literal characters: `\a`, `\A`, etc. These should be
  1444. * SyntaxErrors but are allowed in web reality. XRegExp makes them errors for cross-browser
  1445. * consistency and to reserve their syntax, but lets them be superseded by addons.
  1446. */
  1447. add(
  1448. /\\([ABCE-RTUVXYZaeg-mopqyz]|c(?![A-Za-z])|u(?![\dA-Fa-f]{4})|x(?![\dA-Fa-f]{2}))/,
  1449. function(match, scope) {
  1450. // \B is allowed in default scope only
  1451. if (match[1] === 'B' && scope === defaultScope) {
  1452. return match[0];
  1453. }
  1454. throw new SyntaxError('Invalid escape ' + match[0]);
  1455. },
  1456. {
  1457. scope: 'all',
  1458. leadChar: '\\'
  1459. }
  1460. );
  1461. /*
  1462. * Empty character class: `[]` or `[^]`. This fixes a critical cross-browser syntax inconsistency.
  1463. * Unless this is standardized (per the ES spec), regex syntax can't be accurately parsed because
  1464. * character class endings can't be determined.
  1465. */
  1466. add(
  1467. /\[(\^?)]/,
  1468. function(match) {
  1469. // For cross-browser compatibility with ES3, convert [] to \b\B and [^] to [\s\S].
  1470. // (?!) should work like \b\B, but is unreliable in some versions of Firefox
  1471. return match[1] ? '[\\s\\S]' : '\\b\\B';
  1472. },
  1473. {leadChar: '['}
  1474. );
  1475. /*
  1476. * Comment pattern: `(?# )`. Inline comments are an alternative to the line comments allowed in
  1477. * free-spacing mode (flag x).
  1478. */
  1479. add(
  1480. /\(\?#[^)]*\)/,
  1481. function(match, scope, flags) {
  1482. // Keep tokens separated unless the following token is a quantifier
  1483. return isQuantifierNext(match.input, match.index + match[0].length, flags) ?
  1484. '' : '(?:)';
  1485. },
  1486. {leadChar: '('}
  1487. );
  1488. /*
  1489. * Whitespace and line comments, in free-spacing mode (aka extended mode, flag x) only.
  1490. */
  1491. add(
  1492. /\s+|#.*/,
  1493. function(match, scope, flags) {
  1494. // Keep tokens separated unless the following token is a quantifier
  1495. return isQuantifierNext(match.input, match.index + match[0].length, flags) ?
  1496. '' : '(?:)';
  1497. },
  1498. {flag: 'x'}
  1499. );
  1500. /*
  1501. * Dot, in dotall mode (aka singleline mode, flag s) only.
  1502. */
  1503. add(
  1504. /\./,
  1505. function() {
  1506. return '[\\s\\S]';
  1507. },
  1508. {
  1509. flag: 's',
  1510. leadChar: '.'
  1511. }
  1512. );
  1513. /*
  1514. * Named backreference: `\k<name>`. Backreference names can use the characters A-Z, a-z, 0-9, _,
  1515. * and $ only. Also allows numbered backreferences as `\k<n>`.
  1516. */
  1517. add(
  1518. /\\k<([\w$]+)>/,
  1519. function(match) {
  1520. // Groups with the same name is an error, else would need `lastIndexOf`
  1521. var index = isNaN(match[1]) ? (indexOf(this.captureNames, match[1]) + 1) : +match[1],
  1522. endIndex = match.index + match[0].length;
  1523. if (!index || index > this.captureNames.length) {
  1524. throw new SyntaxError('Backreference to undefined group ' + match[0]);
  1525. }
  1526. // Keep backreferences separate from subsequent literal numbers
  1527. return '\\' + index + (
  1528. endIndex === match.input.length || isNaN(match.input.charAt(endIndex)) ?
  1529. '' : '(?:)'
  1530. );
  1531. },
  1532. {leadChar: '\\'}
  1533. );
  1534. /*
  1535. * Numbered backreference or octal, plus any following digits: `\0`, `\11`, etc. Octals except `\0`
  1536. * not followed by 0-9 and backreferences to unopened capture groups throw an error. Other matches
  1537. * are returned unaltered. IE < 9 doesn't support backreferences above `\99` in regex syntax.
  1538. */
  1539. add(
  1540. /\\(\d+)/,
  1541. function(match, scope) {
  1542. if (
  1543. !(
  1544. scope === defaultScope &&
  1545. /^[1-9]/.test(match[1]) &&
  1546. +match[1] <= this.captureNames.length
  1547. ) &&
  1548. match[1] !== '0'
  1549. ) {
  1550. throw new SyntaxError('Cannot use octal escape or backreference to undefined group ' +
  1551. match[0]);
  1552. }
  1553. return match[0];
  1554. },
  1555. {
  1556. scope: 'all',
  1557. leadChar: '\\'
  1558. }
  1559. );
  1560. /*
  1561. * Named capturing group; match the opening delimiter only: `(?<name>`. Capture names can use the
  1562. * characters A-Z, a-z, 0-9, _, and $ only. Names can't be integers. Supports Python-style
  1563. * `(?P<name>` as an alternate syntax to avoid issues in recent Opera (which natively supports the
  1564. * Python-style syntax). Otherwise, XRegExp might treat numbered backreferences to Python-style
  1565. * named capture as octals.
  1566. */
  1567. add(
  1568. /\(\?P?<([\w$]+)>/,
  1569. function(match) {
  1570. // Disallow bare integers as names because named backreferences are added to match
  1571. // arrays and therefore numeric properties may lead to incorrect lookups
  1572. if (!isNaN(match[1])) {
  1573. throw new SyntaxError('Cannot use integer as capture name ' + match[0]);
  1574. }
  1575. if (match[1] === 'length' || match[1] === '__proto__') {
  1576. throw new SyntaxError('Cannot use reserved word as capture name ' + match[0]);
  1577. }
  1578. if (indexOf(this.captureNames, match[1]) > -1) {
  1579. throw new SyntaxError('Cannot use same name for multiple groups ' + match[0]);
  1580. }
  1581. this.captureNames.push(match[1]);
  1582. this.hasNamedCapture = true;
  1583. return '(';
  1584. },
  1585. {leadChar: '('}
  1586. );
  1587. /*
  1588. * Capturing group; match the opening parenthesis only. Required for support of named capturing
  1589. * groups. Also adds explicit capture mode (flag n).
  1590. */
  1591. add(
  1592. /\((?!\?)/,
  1593. function(match, scope, flags) {
  1594. if (flags.indexOf('n') > -1) {
  1595. return '(?:';
  1596. }
  1597. this.captureNames.push(null);
  1598. return '(';
  1599. },
  1600. {
  1601. optionalFlags: 'n',
  1602. leadChar: '('
  1603. }
  1604. );
  1605. /* ==============================
  1606. * Expose XRegExp
  1607. * ============================== */
  1608. return self;
  1609. }());
  1610. /*!
  1611. * XRegExp.build 3.0.0-pre
  1612. * <http://xregexp.com/>
  1613. * Steven Levithan (c) 2012-2015 MIT License
  1614. * Inspired by Lea Verou's RegExp.create <http://lea.verou.me/>
  1615. */
  1616. (function(XRegExp) {
  1617. 'use strict';
  1618. var REGEX_DATA = 'xregexp',
  1619. subParts = /(\()(?!\?)|\\([1-9]\d*)|\\[\s\S]|\[(?:[^\\\]]|\\[\s\S])*]/g,
  1620. parts = XRegExp.union([/\({{([\w$]+)}}\)|{{([\w$]+)}}/, subParts], 'g');
  1621. /**
  1622. * Strips a leading `^` and trailing unescaped `$`, if both are present.
  1623. *
  1624. * @private
  1625. * @param {String} pattern Pattern to process.
  1626. * @returns {String} Pattern with edge anchors removed.
  1627. */
  1628. function deanchor(pattern) {
  1629. var leadingAnchor = /^\^/,
  1630. trailingAnchor = /\$$/;
  1631. // Ensure that the trailing `$` isn't escaped
  1632. if (leadingAnchor.test(pattern) && trailingAnchor.test(pattern.replace(/\\[\s\S]/g, ''))) {
  1633. return pattern.replace(leadingAnchor, '').replace(trailingAnchor, '');
  1634. }
  1635. return pattern;
  1636. }
  1637. /**
  1638. * Converts the provided value to an XRegExp. Native RegExp flags are not preserved.
  1639. *
  1640. * @private
  1641. * @param {String|RegExp} value Value to convert.
  1642. * @returns {RegExp} XRegExp object with XRegExp syntax applied.
  1643. */
  1644. function asXRegExp(value) {
  1645. return XRegExp.isRegExp(value) ?
  1646. (value[REGEX_DATA] && value[REGEX_DATA].captureNames ?
  1647. // Don't recompile, to preserve capture names
  1648. value :
  1649. // Recompile as XRegExp
  1650. XRegExp(value.source)
  1651. ) :
  1652. // Compile string as XRegExp
  1653. XRegExp(value);
  1654. }
  1655. /**
  1656. * Builds regexes using named subpatterns, for readability and pattern reuse. Backreferences in the
  1657. * outer pattern and provided subpatterns are automatically renumbered to work correctly. Native
  1658. * flags used by provided subpatterns are ignored in favor of the `flags` argument.
  1659. *
  1660. * @memberOf XRegExp
  1661. * @param {String} pattern XRegExp pattern using `{{name}}` for embedded subpatterns. Allows
  1662. * `({{name}})` as shorthand for `(?<name>{{name}})`. Patterns cannot be embedded within
  1663. * character classes.
  1664. * @param {Object} subs Lookup object for named subpatterns. Values can be strings or regexes. A
  1665. * leading `^` and trailing unescaped `$` are stripped from subpatterns, if both are present.
  1666. * @param {String} [flags] Any combination of XRegExp flags.
  1667. * @returns {RegExp} Regex with interpolated subpatterns.
  1668. * @example
  1669. *
  1670. * var time = XRegExp.build('(?x)^ {{hours}} ({{minutes}}) $', {
  1671. * hours: XRegExp.build('{{h12}} : | {{h24}}', {
  1672. * h12: /1[0-2]|0?[1-9]/,
  1673. * h24: /2[0-3]|[01][0-9]/
  1674. * }, 'x'),
  1675. * minutes: /^[0-5][0-9]$/
  1676. * });
  1677. * time.test('10:59'); // -> true
  1678. * XRegExp.exec('10:59', time).minutes; // -> '59'
  1679. */
  1680. XRegExp.build = function(pattern, subs, flags) {
  1681. var inlineFlags = /^\(\?([\w$]+)\)/.exec(pattern),
  1682. data = {},
  1683. numCaps = 0, // 'Caps' is short for captures
  1684. numPriorCaps,
  1685. numOuterCaps = 0,
  1686. outerCapsMap = [0],
  1687. outerCapNames,
  1688. sub,
  1689. p;
  1690. // Add flags within a leading mode modifier to the overall pattern's flags
  1691. if (inlineFlags) {
  1692. flags = flags || '';
  1693. inlineFlags[1].replace(/./g, function(flag) {
  1694. // Don't add duplicates
  1695. flags += (flags.indexOf(flag) > -1 ? '' : flag);
  1696. });
  1697. }
  1698. for (p in subs) {
  1699. if (subs.hasOwnProperty(p)) {
  1700. // Passing to XRegExp enables extended syntax and ensures independent validity,
  1701. // lest an unescaped `(`, `)`, `[`, or trailing `\` breaks the `(?:)` wrapper. For
  1702. // subpatterns provided as native regexes, it dies on octals and adds the property
  1703. // used to hold extended regex instance data, for simplicity
  1704. sub = asXRegExp(subs[p]);
  1705. data[p] = {
  1706. // Deanchoring allows embedding independently useful anchored regexes. If you
  1707. // really need to keep your anchors, double them (i.e., `^^...$$`)
  1708. pattern: deanchor(sub.source),
  1709. names: sub[REGEX_DATA].captureNames || []
  1710. };
  1711. }
  1712. }
  1713. // Passing to XRegExp dies on octals and ensures the outer pattern is independently valid;
  1714. // helps keep this simple. Named captures will be put back
  1715. pattern = asXRegExp(pattern);
  1716. outerCapNames = pattern[REGEX_DATA].captureNames || [];
  1717. pattern = pattern.source.replace(parts, function($0, $1, $2, $3, $4) {
  1718. var subName = $1 || $2, capName, intro;
  1719. // Named subpattern
  1720. if (subName) {
  1721. if (!data.hasOwnProperty(subName)) {
  1722. throw new ReferenceError('Undefined property ' + $0);
  1723. }
  1724. // Named subpattern was wrapped in a capturing group
  1725. if ($1) {
  1726. capName = outerCapNames[numOuterCaps];
  1727. outerCapsMap[++numOuterCaps] = ++numCaps;
  1728. // If it's a named group, preserve the name. Otherwise, use the subpattern name
  1729. // as the capture name
  1730. intro = '(?<' + (capName || subName) + '>';
  1731. } else {
  1732. intro = '(?:';
  1733. }
  1734. numPriorCaps = numCaps;
  1735. return intro + data[subName].pattern.replace(subParts, function(match, paren, backref) {
  1736. // Capturing group
  1737. if (paren) {
  1738. capName = data[subName].names[numCaps - numPriorCaps];
  1739. ++numCaps;
  1740. // If the current capture has a name, preserve the name
  1741. if (capName) {
  1742. return '(?<' + capName + '>';
  1743. }
  1744. // Backreference
  1745. } else if (backref) {
  1746. // Rewrite the backreference
  1747. return '\\' + (+backref + numPriorCaps);
  1748. }
  1749. return match;
  1750. }) + ')';
  1751. }
  1752. // Capturing group
  1753. if ($3) {
  1754. capName = outerCapNames[numOuterCaps];
  1755. outerCapsMap[++numOuterCaps] = ++numCaps;
  1756. // If the current capture has a name, preserve the name
  1757. if (capName) {
  1758. return '(?<' + capName + '>';
  1759. }
  1760. // Backreference
  1761. } else if ($4) {
  1762. // Rewrite the backreference
  1763. return '\\' + outerCapsMap[+$4];
  1764. }
  1765. return $0;
  1766. });
  1767. return XRegExp(pattern, flags);
  1768. };
  1769. }(XRegExp));
  1770. /*!
  1771. * XRegExp.matchRecursive 3.0.0-pre
  1772. * <http://xregexp.com/>
  1773. * Steven Levithan (c) 2009-2015 MIT License
  1774. */
  1775. (function(XRegExp) {
  1776. 'use strict';
  1777. /**
  1778. * Returns a match detail object composed of the provided values.
  1779. *
  1780. * @private
  1781. */
  1782. function row(name, value, start, end) {
  1783. return {
  1784. name: name,
  1785. value: value,
  1786. start: start,
  1787. end: end
  1788. };
  1789. }
  1790. /**
  1791. * Returns an array of match strings between outermost left and right delimiters, or an array of
  1792. * objects with detailed match parts and position data. An error is thrown if delimiters are
  1793. * unbalanced within the data.
  1794. *
  1795. * @memberOf XRegExp
  1796. * @param {String} str String to search.
  1797. * @param {String} left Left delimiter as an XRegExp pattern.
  1798. * @param {String} right Right delimiter as an XRegExp pattern.
  1799. * @param {String} [flags] Any native or XRegExp flags, used for the left and right delimiters.
  1800. * @param {Object} [options] Lets you specify `valueNames` and `escapeChar` options.
  1801. * @returns {Array} Array of matches, or an empty array.
  1802. * @example
  1803. *
  1804. * // Basic usage
  1805. * var str = '(t((e))s)t()(ing)';
  1806. * XRegExp.matchRecursive(str, '\\(', '\\)', 'g');
  1807. * // -> ['t((e))s', '', 'ing']
  1808. *
  1809. * // Extended information mode with valueNames
  1810. * str = 'Here is <div> <div>an</div></div> example';
  1811. * XRegExp.matchRecursive(str, '<div\\s*>', '</div>', 'gi', {
  1812. * valueNames: ['between', 'left', 'match', 'right']
  1813. * });
  1814. * // -> [
  1815. * // {name: 'between', value: 'Here is ', start: 0, end: 8},
  1816. * // {name: 'left', value: '<div>', start: 8, end: 13},
  1817. * // {name: 'match', value: ' <div>an</div>', start: 13, end: 27},
  1818. * // {name: 'right', value: '</div>', start: 27, end: 33},
  1819. * // {name: 'between', value: ' example', start: 33, end: 41}
  1820. * // ]
  1821. *
  1822. * // Omitting unneeded parts with null valueNames, and using escapeChar
  1823. * str = '...{1}\\{{function(x,y){return y+x;}}';
  1824. * XRegExp.matchRecursive(str, '{', '}', 'g', {
  1825. * valueNames: ['literal', null, 'value', null],
  1826. * escapeChar: '\\'
  1827. * });
  1828. * // -> [
  1829. * // {name: 'literal', value: '...', start: 0, end: 3},
  1830. * // {name: 'value', value: '1', start: 4, end: 5},
  1831. * // {name: 'literal', value: '\\{', start: 6, end: 8},
  1832. * // {name: 'value', value: 'function(x,y){return y+x;}', start: 9, end: 35}
  1833. * // ]
  1834. *
  1835. * // Sticky mode via flag y
  1836. * str = '<1><<<2>>><3>4<5>';
  1837. * XRegExp.matchRecursive(str, '<', '>', 'gy');
  1838. * // -> ['1', '<<2>>', '3']
  1839. */
  1840. XRegExp.matchRecursive = function(str, left, right, flags, options) {
  1841. flags = flags || '';
  1842. options = options || {};
  1843. var global = flags.indexOf('g') > -1,
  1844. sticky = flags.indexOf('y') > -1,
  1845. // Flag `y` is controlled internally
  1846. basicFlags = flags.replace(/y/g, ''),
  1847. escapeChar = options.escapeChar,
  1848. vN = options.valueNames,
  1849. output = [],
  1850. openTokens = 0,
  1851. delimStart = 0,
  1852. delimEnd = 0,
  1853. lastOuterEnd = 0,
  1854. outerStart,
  1855. innerStart,
  1856. leftMatch,
  1857. rightMatch,
  1858. esc;
  1859. left = XRegExp(left, basicFlags);
  1860. right = XRegExp(right, basicFlags);
  1861. if (escapeChar) {
  1862. if (escapeChar.length > 1) {
  1863. throw new Error('Cannot use more than one escape character');
  1864. }
  1865. escapeChar = XRegExp.escape(escapeChar);
  1866. // Using `XRegExp.union` safely rewrites backreferences in `left` and `right`
  1867. esc = new RegExp(
  1868. '(?:' + escapeChar + '[\\S\\s]|(?:(?!' +
  1869. XRegExp.union([left, right]).source +
  1870. ')[^' + escapeChar + '])+)+',
  1871. // Flags `gy` not needed here
  1872. flags.replace(/[^im]+/g, '')
  1873. );
  1874. }
  1875. while (true) {
  1876. // If using an escape character, advance to the delimiter's next starting position,
  1877. // skipping any escaped characters in between
  1878. if (escapeChar) {
  1879. delimEnd += (XRegExp.exec(str, esc, delimEnd, 'sticky') || [''])[0].length;
  1880. }
  1881. leftMatch = XRegExp.exec(str, left, delimEnd);
  1882. rightMatch = XRegExp.exec(str, right, delimEnd);
  1883. // Keep the leftmost match only
  1884. if (leftMatch && rightMatch) {
  1885. if (leftMatch.index <= rightMatch.index) {
  1886. rightMatch = null;
  1887. } else {
  1888. leftMatch = null;
  1889. }
  1890. }
  1891. // Paths (LM: leftMatch, RM: rightMatch, OT: openTokens):
  1892. // LM | RM | OT | Result
  1893. // 1 | 0 | 1 | loop
  1894. // 1 | 0 | 0 | loop
  1895. // 0 | 1 | 1 | loop
  1896. // 0 | 1 | 0 | throw
  1897. // 0 | 0 | 1 | throw
  1898. // 0 | 0 | 0 | break
  1899. // The paths above don't include the sticky mode special case. The loop ends after the
  1900. // first completed match if not `global`.
  1901. if (leftMatch || rightMatch) {
  1902. delimStart = (leftMatch || rightMatch).index;
  1903. delimEnd = delimStart + (leftMatch || rightMatch)[0].length;
  1904. } else if (!openTokens) {
  1905. break;
  1906. }
  1907. if (sticky && !openTokens && delimStart > lastOuterEnd) {
  1908. break;
  1909. }
  1910. if (leftMatch) {
  1911. if (!openTokens) {
  1912. outerStart = delimStart;
  1913. innerStart = delimEnd;
  1914. }
  1915. ++openTokens;
  1916. } else if (rightMatch && openTokens) {
  1917. if (!--openTokens) {
  1918. if (vN) {
  1919. if (vN[0] && outerStart > lastOuterEnd) {
  1920. output.push(row(vN[0], str.slice(lastOuterEnd, outerStart), lastOuterEnd, outerStart));
  1921. }
  1922. if (vN[1]) {
  1923. output.push(row(vN[1], str.slice(outerStart, innerStart), outerStart, innerStart));
  1924. }
  1925. if (vN[2]) {
  1926. output.push(row(vN[2], str.slice(innerStart, delimStart), innerStart, delimStart));
  1927. }
  1928. if (vN[3]) {
  1929. output.push(row(vN[3], str.slice(delimStart, delimEnd), delimStart, delimEnd));
  1930. }
  1931. } else {
  1932. output.push(str.slice(innerStart, delimStart));
  1933. }
  1934. lastOuterEnd = delimEnd;
  1935. if (!global) {
  1936. break;
  1937. }
  1938. }
  1939. } else {
  1940. throw new Error('Unbalanced delimiter found in string');
  1941. }
  1942. // If the delimiter matched an empty string, avoid an infinite loop
  1943. if (delimStart === delimEnd) {
  1944. ++delimEnd;
  1945. }
  1946. }
  1947. if (global && !sticky && vN && vN[0] && str.length > lastOuterEnd) {
  1948. output.push(row(vN[0], str.slice(lastOuterEnd), lastOuterEnd, str.length));
  1949. }
  1950. return output;
  1951. };
  1952. }(XRegExp));
  1953. /*!
  1954. * XRegExp Unicode Base 3.0.0-pre
  1955. * <http://xregexp.com/>
  1956. * Steven Levithan (c) 2008-2015 MIT License
  1957. */
  1958. /**
  1959. * Adds base support for Unicode matching:
  1960. * - Adds syntax `\p{..}` for matching Unicode tokens. Tokens can be inverted using `\P{..}` or
  1961. * `\p{^..}`. Token names ignore case, spaces, hyphens, and underscores. You can omit the brackets
  1962. * for token names that are a single letter (e.g. `\pL` or `PL`).
  1963. * - Adds flag A (astral), which enables 21-bit Unicode support.
  1964. * - Adds the `XRegExp.addUnicodeData` method used by other addons to provide character data.
  1965. *
  1966. * Unicode Base relies on externally provided Unicode character data. Official addons are available
  1967. * to provide data for Unicode categories, scripts, blocks, and properties.
  1968. *
  1969. * @requires XRegExp
  1970. */
  1971. (function(XRegExp) {
  1972. 'use strict';
  1973. // Storage for Unicode data
  1974. var unicode = {};
  1975. /* ==============================
  1976. * Private functions
  1977. * ============================== */
  1978. // Generates a token lookup name: lowercase, with hyphens, spaces, and underscores removed
  1979. function normalize(name) {
  1980. return name.replace(/[- _]+/g, '').toLowerCase();
  1981. }
  1982. // Adds leading zeros if shorter than four characters
  1983. function pad4(str) {
  1984. while (str.length < 4) {
  1985. str = '0' + str;
  1986. }
  1987. return str;
  1988. }
  1989. // Converts a hexadecimal number to decimal
  1990. function dec(hex) {
  1991. return parseInt(hex, 16);
  1992. }
  1993. // Converts a decimal number to hexadecimal
  1994. function hex(dec) {
  1995. return parseInt(dec, 10).toString(16);
  1996. }
  1997. // Gets the decimal code of a literal code unit, \xHH, \uHHHH, or a backslash-escaped literal
  1998. function charCode(chr) {
  1999. var esc = /^\\[xu](.+)/.exec(chr);
  2000. return esc ?
  2001. dec(esc[1]) :
  2002. chr.charCodeAt(chr.charAt(0) === '\\' ? 1 : 0);
  2003. }
  2004. // Inverts a list of ordered BMP characters and ranges
  2005. function invertBmp(range) {
  2006. var output = '',
  2007. lastEnd = -1,
  2008. start;
  2009. XRegExp.forEach(range, /(\\x..|\\u....|\\?[\s\S])(?:-(\\x..|\\u....|\\?[\s\S]))?/, function(m) {
  2010. start = charCode(m[1]);
  2011. if (start > (lastEnd + 1)) {
  2012. output += '\\u' + pad4(hex(lastEnd + 1));
  2013. if (start > (lastEnd + 2)) {
  2014. output += '-\\u' + pad4(hex(start - 1));
  2015. }
  2016. }
  2017. lastEnd = charCode(m[2] || m[1]);
  2018. });
  2019. if (lastEnd < 0xFFFF) {
  2020. output += '\\u' + pad4(hex(lastEnd + 1));
  2021. if (lastEnd < 0xFFFE) {
  2022. output += '-\\uFFFF';
  2023. }
  2024. }
  2025. return output;
  2026. }
  2027. // Generates an inverted BMP range on first use
  2028. function cacheInvertedBmp(slug) {
  2029. var prop = 'b!';
  2030. return unicode[slug][prop] || (
  2031. unicode[slug][prop] = invertBmp(unicode[slug].bmp)
  2032. );
  2033. }
  2034. // Combines and optionally negates BMP and astral data
  2035. function buildAstral(slug, isNegated) {
  2036. var item = unicode[slug],
  2037. combined = '';
  2038. if (item.bmp && !item.isBmpLast) {
  2039. combined = '[' + item.bmp + ']' + (item.astral ? '|' : '');
  2040. }
  2041. if (item.astral) {
  2042. combined += item.astral;
  2043. }
  2044. if (item.isBmpLast && item.bmp) {
  2045. combined += (item.astral ? '|' : '') + '[' + item.bmp + ']';
  2046. }
  2047. // Astral Unicode tokens always match a code point, never a code unit
  2048. return isNegated ?
  2049. '(?:(?!' + combined + ')(?:[\uD800-\uDBFF][\uDC00-\uDFFF]|[\0-\uFFFF]))' :
  2050. '(?:' + combined + ')';
  2051. }
  2052. // Builds a complete astral pattern on first use
  2053. function cacheAstral(slug, isNegated) {
  2054. var prop = isNegated ? 'a!' : 'a=';
  2055. return unicode[slug][prop] || (
  2056. unicode[slug][prop] = buildAstral(slug, isNegated)
  2057. );
  2058. }
  2059. /* ==============================
  2060. * Core functionality
  2061. * ============================== */
  2062. /*
  2063. * Add Unicode token syntax: \p{..}, \P{..}, \p{^..}. Also add astral mode (flag A).
  2064. */
  2065. XRegExp.addToken(
  2066. // Use `*` instead of `+` to avoid capturing `^` as the token name in `\p{^}`
  2067. /\\([pP])(?:{(\^?)([^}]*)}|([A-Za-z]))/,
  2068. function(match, scope, flags) {
  2069. var ERR_DOUBLE_NEG = 'Invalid double negation ',
  2070. ERR_UNKNOWN_NAME = 'Unknown Unicode token ',
  2071. ERR_UNKNOWN_REF = 'Unicode token missing data ',
  2072. ERR_ASTRAL_ONLY = 'Astral mode required for Unicode token ',
  2073. ERR_ASTRAL_IN_CLASS = 'Astral mode does not support Unicode tokens within character classes',
  2074. // Negated via \P{..} or \p{^..}
  2075. isNegated = match[1] === 'P' || !!match[2],
  2076. // Switch from BMP (U+FFFF) to astral (U+10FFFF) mode via flag A or implicit opt-in
  2077. isAstralMode = flags.indexOf('A') > -1 || XRegExp.isInstalled('astral'),
  2078. // Token lookup name. Check `[4]` first to avoid passing `undefined` via `\p{}`
  2079. slug = normalize(match[4] || match[3]),
  2080. // Token data object
  2081. item = unicode[slug];
  2082. if (match[1] === 'P' && match[2]) {
  2083. throw new SyntaxError(ERR_DOUBLE_NEG + match[0]);
  2084. }
  2085. if (!unicode.hasOwnProperty(slug)) {
  2086. throw new SyntaxError(ERR_UNKNOWN_NAME + match[0]);
  2087. }
  2088. // Switch to the negated form of the referenced Unicode token
  2089. if (item.inverseOf) {
  2090. slug = normalize(item.inverseOf);
  2091. if (!unicode.hasOwnProperty(slug)) {
  2092. throw new ReferenceError(ERR_UNKNOWN_REF + match[0] + ' -> ' + item.inverseOf);
  2093. }
  2094. item = unicode[slug];
  2095. isNegated = !isNegated;
  2096. }
  2097. if (!(item.bmp || isAstralMode)) {
  2098. throw new SyntaxError(ERR_ASTRAL_ONLY + match[0]);
  2099. }
  2100. if (isAstralMode) {
  2101. if (scope === 'class') {
  2102. throw new SyntaxError(ERR_ASTRAL_IN_CLASS);
  2103. }
  2104. return cacheAstral(slug, isNegated);
  2105. }
  2106. return scope === 'class' ?
  2107. (isNegated ? cacheInvertedBmp(slug) : item.bmp) :
  2108. (isNegated ? '[^' : '[') + item.bmp + ']';
  2109. },
  2110. {
  2111. scope: 'all',
  2112. optionalFlags: 'A',
  2113. leadChar: '\\'
  2114. }
  2115. );
  2116. /**
  2117. * Adds to the list of Unicode tokens that XRegExp regexes can match via `\p` or `\P`.
  2118. *
  2119. * @memberOf XRegExp
  2120. * @param {Array} data Objects with named character ranges. Each object may have properties `name`,
  2121. * `alias`, `isBmpLast`, `inverseOf`, `bmp`, and `astral`. All but `name` are optional, although
  2122. * one of `bmp` or `astral` is required (unless `inverseOf` is set). If `astral` is absent, the
  2123. * `bmp` data is used for BMP and astral modes. If `bmp` is absent, the name errors in BMP mode
  2124. * but works in astral mode. If both `bmp` and `astral` are provided, the `bmp` data only is used
  2125. * in BMP mode, and the combination of `bmp` and `astral` data is used in astral mode.
  2126. * `isBmpLast` is needed when a token matches orphan high surrogates *and* uses surrogate pairs
  2127. * to match astral code points. The `bmp` and `astral` data should be a combination of literal
  2128. * characters and `\xHH` or `\uHHHH` escape sequences, with hyphens to create ranges. Any regex
  2129. * metacharacters in the data should be escaped, apart from range-creating hyphens. The `astral`
  2130. * data can additionally use character classes and alternation, and should use surrogate pairs to
  2131. * represent astral code points. `inverseOf` can be used to avoid duplicating character data if a
  2132. * Unicode token is defined as the exact inverse of another token.
  2133. * @example
  2134. *
  2135. * // Basic use
  2136. * XRegExp.addUnicodeData([{
  2137. * name: 'XDigit',
  2138. * alias: 'Hexadecimal',
  2139. * bmp: '0-9A-Fa-f'
  2140. * }]);
  2141. * XRegExp('\\p{XDigit}:\\p{Hexadecimal}+').test('0:3D'); // -> true
  2142. */
  2143. XRegExp.addUnicodeData = function(data) {
  2144. var ERR_NO_NAME = 'Unicode token requires name',
  2145. ERR_NO_DATA = 'Unicode token has no character data ',
  2146. item,
  2147. i;
  2148. for (i = 0; i < data.length; ++i) {
  2149. item = data[i];
  2150. if (!item.name) {
  2151. throw new Error(ERR_NO_NAME);
  2152. }
  2153. if (!(item.inverseOf || item.bmp || item.astral)) {
  2154. throw new Error(ERR_NO_DATA + item.name);
  2155. }
  2156. unicode[normalize(item.name)] = item;
  2157. if (item.alias) {
  2158. unicode[normalize(item.alias)] = item;
  2159. }
  2160. }
  2161. // Reset the pattern cache used by the `XRegExp` constructor, since the same pattern and
  2162. // flags might now produce different results
  2163. XRegExp.cache.flush('patterns');
  2164. };
  2165. }(XRegExp));
  2166. /*!
  2167. * XRegExp Unicode Blocks 3.0.0-pre
  2168. * <http://xregexp.com/>
  2169. * Steven Levithan (c) 2010-2015 MIT License
  2170. * Unicode data provided by Mathias Bynens <http://mathiasbynens.be/>
  2171. */
  2172. /**
  2173. * Adds support for all Unicode blocks. Block names use the prefix 'In'. E.g., `\p{InBasicLatin}`.
  2174. * Token names are case insensitive, and any spaces, hyphens, and underscores are ignored.
  2175. *
  2176. * Uses Unicode 7.0.0.
  2177. *
  2178. * @requires XRegExp, Unicode Base
  2179. */
  2180. (function(XRegExp) {
  2181. 'use strict';
  2182. if (!XRegExp.addUnicodeData) {
  2183. throw new ReferenceError('Unicode Base must be loaded before Unicode Blocks');
  2184. }
  2185. XRegExp.addUnicodeData([
  2186. {
  2187. name: 'InAegean_Numbers',
  2188. astral: '\uD800[\uDD00-\uDD3F]'
  2189. },
  2190. {
  2191. name: 'InAlchemical_Symbols',
  2192. astral: '\uD83D[\uDF00-\uDF7F]'
  2193. },
  2194. {
  2195. name: 'InAlphabetic_Presentation_Forms',
  2196. bmp: '\uFB00-\uFB4F'
  2197. },
  2198. {
  2199. name: 'InAncient_Greek_Musical_Notation',
  2200. astral: '\uD834[\uDE00-\uDE4F]'
  2201. },
  2202. {
  2203. name: 'InAncient_Greek_Numbers',
  2204. astral: '\uD800[\uDD40-\uDD8F]'
  2205. },
  2206. {
  2207. name: 'InAncient_Symbols',
  2208. astral: '\uD800[\uDD90-\uDDCF]'
  2209. },
  2210. {
  2211. name: 'InArabic',
  2212. bmp: '\u0600-\u06FF'
  2213. },
  2214. {
  2215. name: 'InArabic_Extended_A',
  2216. bmp: '\u08A0-\u08FF'
  2217. },
  2218. {
  2219. name: 'InArabic_Mathematical_Alphabetic_Symbols',
  2220. astral: '\uD83B[\uDE00-\uDEFF]'
  2221. },
  2222. {
  2223. name: 'InArabic_Presentation_Forms_A',
  2224. bmp: '\uFB50-\uFDFF'
  2225. },
  2226. {
  2227. name: 'InArabic_Presentation_Forms_B',
  2228. bmp: '\uFE70-\uFEFF'
  2229. },
  2230. {
  2231. name: 'InArabic_Supplement',
  2232. bmp: '\u0750-\u077F'
  2233. },
  2234. {
  2235. name: 'InArmenian',
  2236. bmp: '\u0530-\u058F'
  2237. },
  2238. {
  2239. name: 'InArrows',
  2240. bmp: '\u2190-\u21FF'
  2241. },
  2242. {
  2243. name: 'InAvestan',
  2244. astral: '\uD802[\uDF00-\uDF3F]'
  2245. },
  2246. {
  2247. name: 'InBalinese',
  2248. bmp: '\u1B00-\u1B7F'
  2249. },
  2250. {
  2251. name: 'InBamum',
  2252. bmp: '\uA6A0-\uA6FF'
  2253. },
  2254. {
  2255. name: 'InBamum_Supplement',
  2256. astral: '\uD81A[\uDC00-\uDE3F]'
  2257. },
  2258. {
  2259. name: 'InBasic_Latin',
  2260. bmp: '\0-\x7F'
  2261. },
  2262. {
  2263. name: 'InBassa_Vah',
  2264. astral: '\uD81A[\uDED0-\uDEFF]'
  2265. },
  2266. {
  2267. name: 'InBatak',
  2268. bmp: '\u1BC0-\u1BFF'
  2269. },
  2270. {
  2271. name: 'InBengali',
  2272. bmp: '\u0980-\u09FF'
  2273. },
  2274. {
  2275. name: 'InBlock_Elements',
  2276. bmp: '\u2580-\u259F'
  2277. },
  2278. {
  2279. name: 'InBopomofo',
  2280. bmp: '\u3100-\u312F'
  2281. },
  2282. {
  2283. name: 'InBopomofo_Extended',
  2284. bmp: '\u31A0-\u31BF'
  2285. },
  2286. {
  2287. name: 'InBox_Drawing',
  2288. bmp: '\u2500-\u257F'
  2289. },
  2290. {
  2291. name: 'InBrahmi',
  2292. astral: '\uD804[\uDC00-\uDC7F]'
  2293. },
  2294. {
  2295. name: 'InBraille_Patterns',
  2296. bmp: '\u2800-\u28FF'
  2297. },
  2298. {
  2299. name: 'InBuginese',
  2300. bmp: '\u1A00-\u1A1F'
  2301. },
  2302. {
  2303. name: 'InBuhid',
  2304. bmp: '\u1740-\u175F'
  2305. },
  2306. {
  2307. name: 'InByzantine_Musical_Symbols',
  2308. astral: '\uD834[\uDC00-\uDCFF]'
  2309. },
  2310. {
  2311. name: 'InCJK_Compatibility',
  2312. bmp: '\u3300-\u33FF'
  2313. },
  2314. {
  2315. name: 'InCJK_Compatibility_Forms',
  2316. bmp: '\uFE30-\uFE4F'
  2317. },
  2318. {
  2319. name: 'InCJK_Compatibility_Ideographs',
  2320. bmp: '\uF900-\uFAFF'
  2321. },
  2322. {
  2323. name: 'InCJK_Compatibility_Ideographs_Supplement',
  2324. astral: '\uD87E[\uDC00-\uDE1F]'
  2325. },
  2326. {
  2327. name: 'InCJK_Radicals_Supplement',
  2328. bmp: '\u2E80-\u2EFF'
  2329. },
  2330. {
  2331. name: 'InCJK_Strokes',
  2332. bmp: '\u31C0-\u31EF'
  2333. },
  2334. {
  2335. name: 'InCJK_Symbols_and_Punctuation',
  2336. bmp: '\u3000-\u303F'
  2337. },
  2338. {
  2339. name: 'InCJK_Unified_Ideographs',
  2340. bmp: '\u4E00-\u9FFF'
  2341. },
  2342. {
  2343. name: 'InCJK_Unified_Ideographs_Extension_A',
  2344. bmp: '\u3400-\u4DBF'
  2345. },
  2346. {
  2347. name: 'InCJK_Unified_Ideographs_Extension_B',
  2348. astral: '[\uD840-\uD868][\uDC00-\uDFFF]|\uD869[\uDC00-\uDEDF]'
  2349. },
  2350. {
  2351. name: 'InCJK_Unified_Ideographs_Extension_C',
  2352. astral: '\uD86D[\uDC00-\uDF3F]|[\uD86A-\uD86C][\uDC00-\uDFFF]|\uD869[\uDF00-\uDFFF]'
  2353. },
  2354. {
  2355. name: 'InCJK_Unified_Ideographs_Extension_D',
  2356. astral: '\uD86D[\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1F]'
  2357. },
  2358. {
  2359. name: 'InCarian',
  2360. astral: '\uD800[\uDEA0-\uDEDF]'
  2361. },
  2362. {
  2363. name: 'InCaucasian_Albanian',
  2364. astral: '\uD801[\uDD30-\uDD6F]'
  2365. },
  2366. {
  2367. name: 'InChakma',
  2368. astral: '\uD804[\uDD00-\uDD4F]'
  2369. },
  2370. {
  2371. name: 'InCham',
  2372. bmp: '\uAA00-\uAA5F'
  2373. },
  2374. {
  2375. name: 'InCherokee',
  2376. bmp: '\u13A0-\u13FF'
  2377. },
  2378. {
  2379. name: 'InCombining_Diacritical_Marks',
  2380. bmp: '\u0300-\u036F'
  2381. },
  2382. {
  2383. name: 'InCombining_Diacritical_Marks_Extended',
  2384. bmp: '\u1AB0-\u1AFF'
  2385. },
  2386. {
  2387. name: 'InCombining_Diacritical_Marks_Supplement',
  2388. bmp: '\u1DC0-\u1DFF'
  2389. },
  2390. {
  2391. name: 'InCombining_Diacritical_Marks_for_Symbols',
  2392. bmp: '\u20D0-\u20FF'
  2393. },
  2394. {
  2395. name: 'InCombining_Half_Marks',
  2396. bmp: '\uFE20-\uFE2F'
  2397. },
  2398. {
  2399. name: 'InCommon_Indic_Number_Forms',
  2400. bmp: '\uA830-\uA83F'
  2401. },
  2402. {
  2403. name: 'InControl_Pictures',
  2404. bmp: '\u2400-\u243F'
  2405. },
  2406. {
  2407. name: 'InCoptic',
  2408. bmp: '\u2C80-\u2CFF'
  2409. },
  2410. {
  2411. name: 'InCoptic_Epact_Numbers',
  2412. astral: '\uD800[\uDEE0-\uDEFF]'
  2413. },
  2414. {
  2415. name: 'InCounting_Rod_Numerals',
  2416. astral: '\uD834[\uDF60-\uDF7F]'
  2417. },
  2418. {
  2419. name: 'InCuneiform',
  2420. astral: '\uD808[\uDC00-\uDFFF]'
  2421. },
  2422. {
  2423. name: 'InCuneiform_Numbers_and_Punctuation',
  2424. astral: '\uD809[\uDC00-\uDC7F]'
  2425. },
  2426. {
  2427. name: 'InCurrency_Symbols',
  2428. bmp: '\u20A0-\u20CF'
  2429. },
  2430. {
  2431. name: 'InCypriot_Syllabary',
  2432. astral: '\uD802[\uDC00-\uDC3F]'
  2433. },
  2434. {
  2435. name: 'InCyrillic',
  2436. bmp: '\u0400-\u04FF'
  2437. },
  2438. {
  2439. name: 'InCyrillic_Extended_A',
  2440. bmp: '\u2DE0-\u2DFF'
  2441. },
  2442. {
  2443. name: 'InCyrillic_Extended_B',
  2444. bmp: '\uA640-\uA69F'
  2445. },
  2446. {
  2447. name: 'InCyrillic_Supplement',
  2448. bmp: '\u0500-\u052F'
  2449. },
  2450. {
  2451. name: 'InDeseret',
  2452. astral: '\uD801[\uDC00-\uDC4F]'
  2453. },
  2454. {
  2455. name: 'InDevanagari',
  2456. bmp: '\u0900-\u097F'
  2457. },
  2458. {
  2459. name: 'InDevanagari_Extended',
  2460. bmp: '\uA8E0-\uA8FF'
  2461. },
  2462. {
  2463. name: 'InDingbats',
  2464. bmp: '\u2700-\u27BF'
  2465. },
  2466. {
  2467. name: 'InDomino_Tiles',
  2468. astral: '\uD83C[\uDC30-\uDC9F]'
  2469. },
  2470. {
  2471. name: 'InDuployan',
  2472. astral: '\uD82F[\uDC00-\uDC9F]'
  2473. },
  2474. {
  2475. name: 'InEgyptian_Hieroglyphs',
  2476. astral: '\uD80C[\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2F]'
  2477. },
  2478. {
  2479. name: 'InElbasan',
  2480. astral: '\uD801[\uDD00-\uDD2F]'
  2481. },
  2482. {
  2483. name: 'InEmoticons',
  2484. astral: '\uD83D[\uDE00-\uDE4F]'
  2485. },
  2486. {
  2487. name: 'InEnclosed_Alphanumeric_Supplement',
  2488. astral: '\uD83C[\uDD00-\uDDFF]'
  2489. },
  2490. {
  2491. name: 'InEnclosed_Alphanumerics',
  2492. bmp: '\u2460-\u24FF'
  2493. },
  2494. {
  2495. name: 'InEnclosed_CJK_Letters_and_Months',
  2496. bmp: '\u3200-\u32FF'
  2497. },
  2498. {
  2499. name: 'InEnclosed_Ideographic_Supplement',
  2500. astral: '\uD83C[\uDE00-\uDEFF]'
  2501. },
  2502. {
  2503. name: 'InEthiopic',
  2504. bmp: '\u1200-\u137F'
  2505. },
  2506. {
  2507. name: 'InEthiopic_Extended',
  2508. bmp: '\u2D80-\u2DDF'
  2509. },
  2510. {
  2511. name: 'InEthiopic_Extended_A',
  2512. bmp: '\uAB00-\uAB2F'
  2513. },
  2514. {
  2515. name: 'InEthiopic_Supplement',
  2516. bmp: '\u1380-\u139F'
  2517. },
  2518. {
  2519. name: 'InGeneral_Punctuation',
  2520. bmp: '\u2000-\u206F'
  2521. },
  2522. {
  2523. name: 'InGeometric_Shapes',
  2524. bmp: '\u25A0-\u25FF'
  2525. },
  2526. {
  2527. name: 'InGeometric_Shapes_Extended',
  2528. astral: '\uD83D[\uDF80-\uDFFF]'
  2529. },
  2530. {
  2531. name: 'InGeorgian',
  2532. bmp: '\u10A0-\u10FF'
  2533. },
  2534. {
  2535. name: 'InGeorgian_Supplement',
  2536. bmp: '\u2D00-\u2D2F'
  2537. },
  2538. {
  2539. name: 'InGlagolitic',
  2540. bmp: '\u2C00-\u2C5F'
  2541. },
  2542. {
  2543. name: 'InGothic',
  2544. astral: '\uD800[\uDF30-\uDF4F]'
  2545. },
  2546. {
  2547. name: 'InGrantha',
  2548. astral: '\uD804[\uDF00-\uDF7F]'
  2549. },
  2550. {
  2551. name: 'InGreek_Extended',
  2552. bmp: '\u1F00-\u1FFF'
  2553. },
  2554. {
  2555. name: 'InGreek_and_Coptic',
  2556. bmp: '\u0370-\u03FF'
  2557. },
  2558. {
  2559. name: 'InGujarati',
  2560. bmp: '\u0A80-\u0AFF'
  2561. },
  2562. {
  2563. name: 'InGurmukhi',
  2564. bmp: '\u0A00-\u0A7F'
  2565. },
  2566. {
  2567. name: 'InHalfwidth_and_Fullwidth_Forms',
  2568. bmp: '\uFF00-\uFFEF'
  2569. },
  2570. {
  2571. name: 'InHangul_Compatibility_Jamo',
  2572. bmp: '\u3130-\u318F'
  2573. },
  2574. {
  2575. name: 'InHangul_Jamo',
  2576. bmp: '\u1100-\u11FF'
  2577. },
  2578. {
  2579. name: 'InHangul_Jamo_Extended_A',
  2580. bmp: '\uA960-\uA97F'
  2581. },
  2582. {
  2583. name: 'InHangul_Jamo_Extended_B',
  2584. bmp: '\uD7B0-\uD7FF'
  2585. },
  2586. {
  2587. name: 'InHangul_Syllables',
  2588. bmp: '\uAC00-\uD7AF'
  2589. },
  2590. {
  2591. name: 'InHanunoo',
  2592. bmp: '\u1720-\u173F'
  2593. },
  2594. {
  2595. name: 'InHebrew',
  2596. bmp: '\u0590-\u05FF'
  2597. },
  2598. {
  2599. name: 'InHigh_Private_Use_Surrogates',
  2600. bmp: '\uDB80-\uDBFF'
  2601. },
  2602. {
  2603. name: 'InHigh_Surrogates',
  2604. bmp: '\uD800-\uDB7F'
  2605. },
  2606. {
  2607. name: 'InHiragana',
  2608. bmp: '\u3040-\u309F'
  2609. },
  2610. {
  2611. name: 'InIPA_Extensions',
  2612. bmp: '\u0250-\u02AF'
  2613. },
  2614. {
  2615. name: 'InIdeographic_Description_Characters',
  2616. bmp: '\u2FF0-\u2FFF'
  2617. },
  2618. {
  2619. name: 'InImperial_Aramaic',
  2620. astral: '\uD802[\uDC40-\uDC5F]'
  2621. },
  2622. {
  2623. name: 'InInscriptional_Pahlavi',
  2624. astral: '\uD802[\uDF60-\uDF7F]'
  2625. },
  2626. {
  2627. name: 'InInscriptional_Parthian',
  2628. astral: '\uD802[\uDF40-\uDF5F]'
  2629. },
  2630. {
  2631. name: 'InJavanese',
  2632. bmp: '\uA980-\uA9DF'
  2633. },
  2634. {
  2635. name: 'InKaithi',
  2636. astral: '\uD804[\uDC80-\uDCCF]'
  2637. },
  2638. {
  2639. name: 'InKana_Supplement',
  2640. astral: '\uD82C[\uDC00-\uDCFF]'
  2641. },
  2642. {
  2643. name: 'InKanbun',
  2644. bmp: '\u3190-\u319F'
  2645. },
  2646. {
  2647. name: 'InKangxi_Radicals',
  2648. bmp: '\u2F00-\u2FDF'
  2649. },
  2650. {
  2651. name: 'InKannada',
  2652. bmp: '\u0C80-\u0CFF'
  2653. },
  2654. {
  2655. name: 'InKatakana',
  2656. bmp: '\u30A0-\u30FF'
  2657. },
  2658. {
  2659. name: 'InKatakana_Phonetic_Extensions',
  2660. bmp: '\u31F0-\u31FF'
  2661. },
  2662. {
  2663. name: 'InKayah_Li',
  2664. bmp: '\uA900-\uA92F'
  2665. },
  2666. {
  2667. name: 'InKharoshthi',
  2668. astral: '\uD802[\uDE00-\uDE5F]'
  2669. },
  2670. {
  2671. name: 'InKhmer',
  2672. bmp: '\u1780-\u17FF'
  2673. },
  2674. {
  2675. name: 'InKhmer_Symbols',
  2676. bmp: '\u19E0-\u19FF'
  2677. },
  2678. {
  2679. name: 'InKhojki',
  2680. astral: '\uD804[\uDE00-\uDE4F]'
  2681. },
  2682. {
  2683. name: 'InKhudawadi',
  2684. astral: '\uD804[\uDEB0-\uDEFF]'
  2685. },
  2686. {
  2687. name: 'InLao',
  2688. bmp: '\u0E80-\u0EFF'
  2689. },
  2690. {
  2691. name: 'InLatin_Extended_Additional',
  2692. bmp: '\u1E00-\u1EFF'
  2693. },
  2694. {
  2695. name: 'InLatin_Extended_A',
  2696. bmp: '\u0100-\u017F'
  2697. },
  2698. {
  2699. name: 'InLatin_Extended_B',
  2700. bmp: '\u0180-\u024F'
  2701. },
  2702. {
  2703. name: 'InLatin_Extended_C',
  2704. bmp: '\u2C60-\u2C7F'
  2705. },
  2706. {
  2707. name: 'InLatin_Extended_D',
  2708. bmp: '\uA720-\uA7FF'
  2709. },
  2710. {
  2711. name: 'InLatin_Extended_E',
  2712. bmp: '\uAB30-\uAB6F'
  2713. },
  2714. {
  2715. name: 'InLatin_1_Supplement',
  2716. bmp: '\x80-\xFF'
  2717. },
  2718. {
  2719. name: 'InLepcha',
  2720. bmp: '\u1C00-\u1C4F'
  2721. },
  2722. {
  2723. name: 'InLetterlike_Symbols',
  2724. bmp: '\u2100-\u214F'
  2725. },
  2726. {
  2727. name: 'InLimbu',
  2728. bmp: '\u1900-\u194F'
  2729. },
  2730. {
  2731. name: 'InLinear_A',
  2732. astral: '\uD801[\uDE00-\uDF7F]'
  2733. },
  2734. {
  2735. name: 'InLinear_B_Ideograms',
  2736. astral: '\uD800[\uDC80-\uDCFF]'
  2737. },
  2738. {
  2739. name: 'InLinear_B_Syllabary',
  2740. astral: '\uD800[\uDC00-\uDC7F]'
  2741. },
  2742. {
  2743. name: 'InLisu',
  2744. bmp: '\uA4D0-\uA4FF'
  2745. },
  2746. {
  2747. name: 'InLow_Surrogates',
  2748. bmp: '\uDC00-\uDFFF'
  2749. },
  2750. {
  2751. name: 'InLycian',
  2752. astral: '\uD800[\uDE80-\uDE9F]'
  2753. },
  2754. {
  2755. name: 'InLydian',
  2756. astral: '\uD802[\uDD20-\uDD3F]'
  2757. },
  2758. {
  2759. name: 'InMahajani',
  2760. astral: '\uD804[\uDD50-\uDD7F]'
  2761. },
  2762. {
  2763. name: 'InMahjong_Tiles',
  2764. astral: '\uD83C[\uDC00-\uDC2F]'
  2765. },
  2766. {
  2767. name: 'InMalayalam',
  2768. bmp: '\u0D00-\u0D7F'
  2769. },
  2770. {
  2771. name: 'InMandaic',
  2772. bmp: '\u0840-\u085F'
  2773. },
  2774. {
  2775. name: 'InManichaean',
  2776. astral: '\uD802[\uDEC0-\uDEFF]'
  2777. },
  2778. {
  2779. name: 'InMathematical_Alphanumeric_Symbols',
  2780. astral: '\uD835[\uDC00-\uDFFF]'
  2781. },
  2782. {
  2783. name: 'InMathematical_Operators',
  2784. bmp: '\u2200-\u22FF'
  2785. },
  2786. {
  2787. name: 'InMeetei_Mayek',
  2788. bmp: '\uABC0-\uABFF'
  2789. },
  2790. {
  2791. name: 'InMeetei_Mayek_Extensions',
  2792. bmp: '\uAAE0-\uAAFF'
  2793. },
  2794. {
  2795. name: 'InMende_Kikakui',
  2796. astral: '\uD83A[\uDC00-\uDCDF]'
  2797. },
  2798. {
  2799. name: 'InMeroitic_Cursive',
  2800. astral: '\uD802[\uDDA0-\uDDFF]'
  2801. },
  2802. {
  2803. name: 'InMeroitic_Hieroglyphs',
  2804. astral: '\uD802[\uDD80-\uDD9F]'
  2805. },
  2806. {
  2807. name: 'InMiao',
  2808. astral: '\uD81B[\uDF00-\uDF9F]'
  2809. },
  2810. {
  2811. name: 'InMiscellaneous_Mathematical_Symbols_A',
  2812. bmp: '\u27C0-\u27EF'
  2813. },
  2814. {
  2815. name: 'InMiscellaneous_Mathematical_Symbols_B',
  2816. bmp: '\u2980-\u29FF'
  2817. },
  2818. {
  2819. name: 'InMiscellaneous_Symbols',
  2820. bmp: '\u2600-\u26FF'
  2821. },
  2822. {
  2823. name: 'InMiscellaneous_Symbols_and_Arrows',
  2824. bmp: '\u2B00-\u2BFF'
  2825. },
  2826. {
  2827. name: 'InMiscellaneous_Symbols_and_Pictographs',
  2828. astral: '\uD83D[\uDC00-\uDDFF]|\uD83C[\uDF00-\uDFFF]'
  2829. },
  2830. {
  2831. name: 'InMiscellaneous_Technical',
  2832. bmp: '\u2300-\u23FF'
  2833. },
  2834. {
  2835. name: 'InModi',
  2836. astral: '\uD805[\uDE00-\uDE5F]'
  2837. },
  2838. {
  2839. name: 'InModifier_Tone_Letters',
  2840. bmp: '\uA700-\uA71F'
  2841. },
  2842. {
  2843. name: 'InMongolian',
  2844. bmp: '\u1800-\u18AF'
  2845. },
  2846. {
  2847. name: 'InMro',
  2848. astral: '\uD81A[\uDE40-\uDE6F]'
  2849. },
  2850. {
  2851. name: 'InMusical_Symbols',
  2852. astral: '\uD834[\uDD00-\uDDFF]'
  2853. },
  2854. {
  2855. name: 'InMyanmar',
  2856. bmp: '\u1000-\u109F'
  2857. },
  2858. {
  2859. name: 'InMyanmar_Extended_A',
  2860. bmp: '\uAA60-\uAA7F'
  2861. },
  2862. {
  2863. name: 'InMyanmar_Extended_B',
  2864. bmp: '\uA9E0-\uA9FF'
  2865. },
  2866. {
  2867. name: 'InNKo',
  2868. bmp: '\u07C0-\u07FF'
  2869. },
  2870. {
  2871. name: 'InNabataean',
  2872. astral: '\uD802[\uDC80-\uDCAF]'
  2873. },
  2874. {
  2875. name: 'InNew_Tai_Lue',
  2876. bmp: '\u1980-\u19DF'
  2877. },
  2878. {
  2879. name: 'InNumber_Forms',
  2880. bmp: '\u2150-\u218F'
  2881. },
  2882. {
  2883. name: 'InOgham',
  2884. bmp: '\u1680-\u169F'
  2885. },
  2886. {
  2887. name: 'InOl_Chiki',
  2888. bmp: '\u1C50-\u1C7F'
  2889. },
  2890. {
  2891. name: 'InOld_Italic',
  2892. astral: '\uD800[\uDF00-\uDF2F]'
  2893. },
  2894. {
  2895. name: 'InOld_North_Arabian',
  2896. astral: '\uD802[\uDE80-\uDE9F]'
  2897. },
  2898. {
  2899. name: 'InOld_Permic',
  2900. astral: '\uD800[\uDF50-\uDF7F]'
  2901. },
  2902. {
  2903. name: 'InOld_Persian',
  2904. astral: '\uD800[\uDFA0-\uDFDF]'
  2905. },
  2906. {
  2907. name: 'InOld_South_Arabian',
  2908. astral: '\uD802[\uDE60-\uDE7F]'
  2909. },
  2910. {
  2911. name: 'InOld_Turkic',
  2912. astral: '\uD803[\uDC00-\uDC4F]'
  2913. },
  2914. {
  2915. name: 'InOptical_Character_Recognition',
  2916. bmp: '\u2440-\u245F'
  2917. },
  2918. {
  2919. name: 'InOriya',
  2920. bmp: '\u0B00-\u0B7F'
  2921. },
  2922. {
  2923. name: 'InOrnamental_Dingbats',
  2924. astral: '\uD83D[\uDE50-\uDE7F]'
  2925. },
  2926. {
  2927. name: 'InOsmanya',
  2928. astral: '\uD801[\uDC80-\uDCAF]'
  2929. },
  2930. {
  2931. name: 'InPahawh_Hmong',
  2932. astral: '\uD81A[\uDF00-\uDF8F]'
  2933. },
  2934. {
  2935. name: 'InPalmyrene',
  2936. astral: '\uD802[\uDC60-\uDC7F]'
  2937. },
  2938. {
  2939. name: 'InPau_Cin_Hau',
  2940. astral: '\uD806[\uDEC0-\uDEFF]'
  2941. },
  2942. {
  2943. name: 'InPhags_pa',
  2944. bmp: '\uA840-\uA87F'
  2945. },
  2946. {
  2947. name: 'InPhaistos_Disc',
  2948. astral: '\uD800[\uDDD0-\uDDFF]'
  2949. },
  2950. {
  2951. name: 'InPhoenician',
  2952. astral: '\uD802[\uDD00-\uDD1F]'
  2953. },
  2954. {
  2955. name: 'InPhonetic_Extensions',
  2956. bmp: '\u1D00-\u1D7F'
  2957. },
  2958. {
  2959. name: 'InPhonetic_Extensions_Supplement',
  2960. bmp: '\u1D80-\u1DBF'
  2961. },
  2962. {
  2963. name: 'InPlaying_Cards',
  2964. astral: '\uD83C[\uDCA0-\uDCFF]'
  2965. },
  2966. {
  2967. name: 'InPrivate_Use_Area',
  2968. bmp: '\uE000-\uF8FF'
  2969. },
  2970. {
  2971. name: 'InPsalter_Pahlavi',
  2972. astral: '\uD802[\uDF80-\uDFAF]'
  2973. },
  2974. {
  2975. name: 'InRejang',
  2976. bmp: '\uA930-\uA95F'
  2977. },
  2978. {
  2979. name: 'InRumi_Numeral_Symbols',
  2980. astral: '\uD803[\uDE60-\uDE7F]'
  2981. },
  2982. {
  2983. name: 'InRunic',
  2984. bmp: '\u16A0-\u16FF'
  2985. },
  2986. {
  2987. name: 'InSamaritan',
  2988. bmp: '\u0800-\u083F'
  2989. },
  2990. {
  2991. name: 'InSaurashtra',
  2992. bmp: '\uA880-\uA8DF'
  2993. },
  2994. {
  2995. name: 'InSharada',
  2996. astral: '\uD804[\uDD80-\uDDDF]'
  2997. },
  2998. {
  2999. name: 'InShavian',
  3000. astral: '\uD801[\uDC50-\uDC7F]'
  3001. },
  3002. {
  3003. name: 'InShorthand_Format_Controls',
  3004. astral: '\uD82F[\uDCA0-\uDCAF]'
  3005. },
  3006. {
  3007. name: 'InSiddham',
  3008. astral: '\uD805[\uDD80-\uDDFF]'
  3009. },
  3010. {
  3011. name: 'InSinhala',
  3012. bmp: '\u0D80-\u0DFF'
  3013. },
  3014. {
  3015. name: 'InSinhala_Archaic_Numbers',
  3016. astral: '\uD804[\uDDE0-\uDDFF]'
  3017. },
  3018. {
  3019. name: 'InSmall_Form_Variants',
  3020. bmp: '\uFE50-\uFE6F'
  3021. },
  3022. {
  3023. name: 'InSora_Sompeng',
  3024. astral: '\uD804[\uDCD0-\uDCFF]'
  3025. },
  3026. {
  3027. name: 'InSpacing_Modifier_Letters',
  3028. bmp: '\u02B0-\u02FF'
  3029. },
  3030. {
  3031. name: 'InSpecials',
  3032. bmp: '\uFFF0-\uFFFF'
  3033. },
  3034. {
  3035. name: 'InSundanese',
  3036. bmp: '\u1B80-\u1BBF'
  3037. },
  3038. {
  3039. name: 'InSundanese_Supplement',
  3040. bmp: '\u1CC0-\u1CCF'
  3041. },
  3042. {
  3043. name: 'InSuperscripts_and_Subscripts',
  3044. bmp: '\u2070-\u209F'
  3045. },
  3046. {
  3047. name: 'InSupplemental_Arrows_A',
  3048. bmp: '\u27F0-\u27FF'
  3049. },
  3050. {
  3051. name: 'InSupplemental_Arrows_B',
  3052. bmp: '\u2900-\u297F'
  3053. },
  3054. {
  3055. name: 'InSupplemental_Arrows_C',
  3056. astral: '\uD83E[\uDC00-\uDCFF]'
  3057. },
  3058. {
  3059. name: 'InSupplemental_Mathematical_Operators',
  3060. bmp: '\u2A00-\u2AFF'
  3061. },
  3062. {
  3063. name: 'InSupplemental_Punctuation',
  3064. bmp: '\u2E00-\u2E7F'
  3065. },
  3066. {
  3067. name: 'InSupplementary_Private_Use_Area_A',
  3068. astral: '[\uDB80-\uDBBF][\uDC00-\uDFFF]'
  3069. },
  3070. {
  3071. name: 'InSupplementary_Private_Use_Area_B',
  3072. astral: '[\uDBC0-\uDBFF][\uDC00-\uDFFF]'
  3073. },
  3074. {
  3075. name: 'InSyloti_Nagri',
  3076. bmp: '\uA800-\uA82F'
  3077. },
  3078. {
  3079. name: 'InSyriac',
  3080. bmp: '\u0700-\u074F'
  3081. },
  3082. {
  3083. name: 'InTagalog',
  3084. bmp: '\u1700-\u171F'
  3085. },
  3086. {
  3087. name: 'InTagbanwa',
  3088. bmp: '\u1760-\u177F'
  3089. },
  3090. {
  3091. name: 'InTags',
  3092. astral: '\uDB40[\uDC00-\uDC7F]'
  3093. },
  3094. {
  3095. name: 'InTai_Le',
  3096. bmp: '\u1950-\u197F'
  3097. },
  3098. {
  3099. name: 'InTai_Tham',
  3100. bmp: '\u1A20-\u1AAF'
  3101. },
  3102. {
  3103. name: 'InTai_Viet',
  3104. bmp: '\uAA80-\uAADF'
  3105. },
  3106. {
  3107. name: 'InTai_Xuan_Jing_Symbols',
  3108. astral: '\uD834[\uDF00-\uDF5F]'
  3109. },
  3110. {
  3111. name: 'InTakri',
  3112. astral: '\uD805[\uDE80-\uDECF]'
  3113. },
  3114. {
  3115. name: 'InTamil',
  3116. bmp: '\u0B80-\u0BFF'
  3117. },
  3118. {
  3119. name: 'InTelugu',
  3120. bmp: '\u0C00-\u0C7F'
  3121. },
  3122. {
  3123. name: 'InThaana',
  3124. bmp: '\u0780-\u07BF'
  3125. },
  3126. {
  3127. name: 'InThai',
  3128. bmp: '\u0E00-\u0E7F'
  3129. },
  3130. {
  3131. name: 'InTibetan',
  3132. bmp: '\u0F00-\u0FFF'
  3133. },
  3134. {
  3135. name: 'InTifinagh',
  3136. bmp: '\u2D30-\u2D7F'
  3137. },
  3138. {
  3139. name: 'InTirhuta',
  3140. astral: '\uD805[\uDC80-\uDCDF]'
  3141. },
  3142. {
  3143. name: 'InTransport_and_Map_Symbols',
  3144. astral: '\uD83D[\uDE80-\uDEFF]'
  3145. },
  3146. {
  3147. name: 'InUgaritic',
  3148. astral: '\uD800[\uDF80-\uDF9F]'
  3149. },
  3150. {
  3151. name: 'InUnified_Canadian_Aboriginal_Syllabics',
  3152. bmp: '\u1400-\u167F'
  3153. },
  3154. {
  3155. name: 'InUnified_Canadian_Aboriginal_Syllabics_Extended',
  3156. bmp: '\u18B0-\u18FF'
  3157. },
  3158. {
  3159. name: 'InVai',
  3160. bmp: '\uA500-\uA63F'
  3161. },
  3162. {
  3163. name: 'InVariation_Selectors',
  3164. bmp: '\uFE00-\uFE0F'
  3165. },
  3166. {
  3167. name: 'InVariation_Selectors_Supplement',
  3168. astral: '\uDB40[\uDD00-\uDDEF]'
  3169. },
  3170. {
  3171. name: 'InVedic_Extensions',
  3172. bmp: '\u1CD0-\u1CFF'
  3173. },
  3174. {
  3175. name: 'InVertical_Forms',
  3176. bmp: '\uFE10-\uFE1F'
  3177. },
  3178. {
  3179. name: 'InWarang_Citi',
  3180. astral: '\uD806[\uDCA0-\uDCFF]'
  3181. },
  3182. {
  3183. name: 'InYi_Radicals',
  3184. bmp: '\uA490-\uA4CF'
  3185. },
  3186. {
  3187. name: 'InYi_Syllables',
  3188. bmp: '\uA000-\uA48F'
  3189. },
  3190. {
  3191. name: 'InYijing_Hexagram_Symbols',
  3192. bmp: '\u4DC0-\u4DFF'
  3193. }
  3194. ]);
  3195. }(XRegExp));
  3196. /*!
  3197. * XRegExp Unicode Categories 3.0.0-pre
  3198. * <http://xregexp.com/>
  3199. * Steven Levithan (c) 2010-2015 MIT License
  3200. * Unicode data provided by Mathias Bynens <http://mathiasbynens.be/>
  3201. */
  3202. /**
  3203. * Adds support for all Unicode categories. E.g., `\p{Lu}` or `\p{Uppercase Letter}`. Token names
  3204. * are case insensitive, and any spaces, hyphens, and underscores are ignored.
  3205. *
  3206. * Uses Unicode 7.0.0.
  3207. *
  3208. * @requires XRegExp, Unicode Base
  3209. */
  3210. (function(XRegExp) {
  3211. 'use strict';
  3212. if (!XRegExp.addUnicodeData) {
  3213. throw new ReferenceError('Unicode Base must be loaded before Unicode Categories');
  3214. }
  3215. XRegExp.addUnicodeData([
  3216. {
  3217. name: 'C',
  3218. alias: 'Other',
  3219. isBmpLast: true,
  3220. bmp: '\0-\x1F\x7F-\x9F\xAD\u0378\u0379\u0380-\u0383\u038B\u038D\u03A2\u0530\u0557\u0558\u0560\u0588\u058B\u058C\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\u08B3-\u08E3\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-\u0BFF\u0C04\u0C0D\u0C11\u0C29\u0C3A-\u0C3C\u0C45\u0C49\u0C4E-\u0C54\u0C57\u0C5A-\u0C5F\u0C64\u0C65\u0C70-\u0C77\u0C80\u0C84\u0C8D\u0C91\u0CA9\u0CB4\u0CBA\u0CBB\u0CC5\u0CC9\u0CCE-\u0CD4\u0CD7-\u0CDD\u0CDF\u0CE4\u0CE5\u0CF0\u0CF3-\u0D00\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-\u0DE5\u0DF0\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\u16F9-\u16FF\u170D\u1715-\u171F\u1737-\u173F\u1754-\u175F\u176D\u1771\u1774-\u177F\u17DE\u17DF\u17EA-\u17EF\u17FA-\u17FF\u180E\u180F\u181A-\u181F\u1878-\u187F\u18AB-\u18AF\u18F6-\u18FF\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\u1AAF\u1ABF-\u1AFF\u1B4C-\u1B4F\u1B7D-\u1B7F\u1BF4-\u1BFB\u1C38-\u1C3A\u1C4A-\u1C4C\u1C80-\u1CBF\u1CC8-\u1CCF\u1CF7\u1CFA-\u1CFF\u1DF6-\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\u20BE-\u20CF\u20F1-\u20FF\u218A-\u218F\u23FB-\u23FF\u2427-\u243F\u244B-\u245F\u2B74\u2B75\u2B96\u2B97\u2BBA-\u2BBC\u2BC9\u2BD2-\u2BFF\u2C2F\u2C5F\u2CF4-\u2CF8\u2D26\u2D28-\u2D2C\u2D2E\u2D2F\u2D68-\u2D6E\u2D71-\u2D7E\u2D97-\u2D9F\u2DA7\u2DAF\u2DB7\u2DBF\u2DC7\u2DCF\u2DD7\u2DDF\u2E43-\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\uA69E\uA6F8-\uA6FF\uA78F\uA7AE\uA7AF\uA7B2-\uA7F6\uA82C-\uA82F\uA83A-\uA83F\uA878-\uA87F\uA8C5-\uA8CD\uA8DA-\uA8DF\uA8FC-\uA8FF\uA954-\uA95E\uA97D-\uA97F\uA9CE\uA9DA-\uA9DD\uA9FF\uAA37-\uAA3F\uAA4E\uAA4F\uAA5A\uAA5B\uAAC3-\uAADA\uAAF7-\uAB00\uAB07\uAB08\uAB0F\uAB10\uAB17-\uAB1F\uAB27\uAB2F\uAB60-\uAB63\uAB66-\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\uFE2E\uFE2F\uFE53\uFE67\uFE6C-\uFE6F\uFE75\uFEFD-\uFF00\uFFBF-\uFFC1\uFFC8\uFFC9\uFFD0\uFFD1\uFFD8\uFFD9\uFFDD-\uFFDF\uFFE7\uFFEF-\uFFFB\uFFFE\uFFFF',
  3221. astral: '\uD83C[\uDC2C-\uDC2F\uDC94-\uDC9F\uDCAF\uDCB0\uDCC0\uDCD0\uDCF6-\uDCFF\uDD0D-\uDD0F\uDD2F\uDD6C-\uDD6F\uDD9B-\uDDE5\uDE03-\uDE0F\uDE3B-\uDE3F\uDE49-\uDE4F\uDE52-\uDEFF\uDF2D-\uDF2F\uDF7E\uDF7F\uDFCF-\uDFD3\uDFF8-\uDFFF]|\uD83D[\uDCFF\uDD4B-\uDD4F\uDD7A\uDDA4\uDE43\uDE44\uDED0-\uDEDF\uDEED-\uDEEF\uDEF4-\uDEFF\uDF74-\uDF7F\uDFD5-\uDFFF]|\uD86D[\uDF35-\uDF3F]|\uD81B[\uDC00-\uDEFF\uDF45-\uDF4F\uDF7F-\uDF8E\uDFA0-\uDFFF]|\uD86E[\uDC1E-\uDFFF]|\uD83E[\uDC0C-\uDC0F\uDC48-\uDC4F\uDC5A-\uDC5F\uDC88-\uDC8F\uDCAE-\uDFFF]|\uD801[\uDC9E\uDC9F\uDCAA-\uDCFF\uDD28-\uDD2F\uDD64-\uDD6E\uDD70-\uDDFF\uDF37-\uDF3F\uDF56-\uDF5F\uDF68-\uDFFF]|\uD800[\uDC0C\uDC27\uDC3B\uDC3E\uDC4E\uDC4F\uDC5E-\uDC7F\uDCFB-\uDCFF\uDD03-\uDD06\uDD34-\uDD36\uDD8D-\uDD8F\uDD9C-\uDD9F\uDDA1-\uDDCF\uDDFE-\uDE7F\uDE9D-\uDE9F\uDED1-\uDEDF\uDEFC-\uDEFF\uDF24-\uDF2F\uDF4B-\uDF4F\uDF7B-\uDF7F\uDF9E\uDFC4-\uDFC7\uDFD6-\uDFFF]|\uD869[\uDED7-\uDEFF]|\uD809[\uDC6F\uDC75-\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]|\uD87E[\uDE1E-\uDFFF]|\uDB40[\uDC00-\uDCFF\uDDF0-\uDFFF]|\uD802[\uDC06\uDC07\uDC09\uDC36\uDC39-\uDC3B\uDC3D\uDC3E\uDC56\uDC9F-\uDCA6\uDCB0-\uDCFF\uDD1C-\uDD1E\uDD3A-\uDD3E\uDD40-\uDD7F\uDDB8-\uDDBD\uDDC0-\uDDFF\uDE04\uDE07-\uDE0B\uDE14\uDE18\uDE34-\uDE37\uDE3B-\uDE3E\uDE48-\uDE4F\uDE59-\uDE5F\uDEA0-\uDEBF\uDEE7-\uDEEA\uDEF7-\uDEFF\uDF36-\uDF38\uDF56\uDF57\uDF73-\uDF77\uDF92-\uDF98\uDF9D-\uDFA8\uDFB0-\uDFFF]|\uD83A[\uDCC5\uDCC6\uDCD7-\uDFFF]|\uD803[\uDC49-\uDE5F\uDE7F-\uDFFF]|\uD80D[\uDC2F-\uDFFF]|[\uD807\uD80A\uD80B\uD80E-\uD819\uD81C-\uD82B\uD82D\uD82E\uD830-\uD833\uD836-\uD839\uD83F\uD86F-\uD87D\uD87F-\uDB3F\uDB41-\uDBFF][\uDC00-\uDFFF]|\uD806[\uDC00-\uDC9F\uDCF3-\uDCFE\uDD00-\uDEBF\uDEF9-\uDFFF]|\uD804[\uDC4E-\uDC51\uDC70-\uDC7E\uDCBD\uDCC2-\uDCCF\uDCE9-\uDCEF\uDCFA-\uDCFF\uDD35\uDD44-\uDD4F\uDD77-\uDD7F\uDDC9-\uDDCC\uDDCE\uDDCF\uDDDB-\uDDE0\uDDF5-\uDDFF\uDE12\uDE3E-\uDEAF\uDEEB-\uDEEF\uDEFA-\uDF00\uDF04\uDF0D\uDF0E\uDF11\uDF12\uDF29\uDF31\uDF34\uDF3A\uDF3B\uDF45\uDF46\uDF49\uDF4A\uDF4E-\uDF56\uDF58-\uDF5C\uDF64\uDF65\uDF6D-\uDF6F\uDF75-\uDFFF]|\uD81A[\uDE39-\uDE3F\uDE5F\uDE6A-\uDE6D\uDE70-\uDECF\uDEEE\uDEEF\uDEF6-\uDEFF\uDF46-\uDF4F\uDF5A\uDF62\uDF78-\uDF7C\uDF90-\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]|\uD834[\uDCF6-\uDCFF\uDD27\uDD28\uDD73-\uDD7A\uDDDE-\uDDFF\uDE46-\uDEFF\uDF57-\uDF5F\uDF72-\uDFFF]|\uD82F[\uDC6B-\uDC6F\uDC7D-\uDC7F\uDC89-\uDC8F\uDC9A\uDC9B\uDCA0-\uDFFF]|\uD808[\uDF99-\uDFFF]|\uD82C[\uDC02-\uDFFF]|\uD805[\uDC00-\uDC7F\uDCC8-\uDCCF\uDCDA-\uDD7F\uDDB6\uDDB7\uDDCA-\uDDFF\uDE45-\uDE4F\uDE5A-\uDE7F\uDEB8-\uDEBF\uDECA-\uDFFF]'
  3222. },
  3223. {
  3224. name: 'Cc',
  3225. alias: 'Control',
  3226. bmp: '\0-\x1F\x7F-\x9F'
  3227. },
  3228. {
  3229. name: 'Cf',
  3230. alias: 'Format',
  3231. bmp: '\xAD\u0600-\u0605\u061C\u06DD\u070F\u180E\u200B-\u200F\u202A-\u202E\u2060-\u2064\u2066-\u206F\uFEFF\uFFF9-\uFFFB',
  3232. astral: '\uDB40[\uDC01\uDC20-\uDC7F]|\uD82F[\uDCA0-\uDCA3]|\uD834[\uDD73-\uDD7A]|\uD804\uDCBD'
  3233. },
  3234. {
  3235. name: 'Cn',
  3236. alias: 'Unassigned',
  3237. bmp: '\u0378\u0379\u0380-\u0383\u038B\u038D\u03A2\u0530\u0557\u0558\u0560\u0588\u058B\u058C\u0590\u05C8-\u05CF\u05EB-\u05EF\u05F5-\u05FF\u061D\u070E\u074B\u074C\u07B2-\u07BF\u07FB-\u07FF\u082E\u082F\u083F\u085C\u085D\u085F-\u089F\u08B3-\u08E3\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-\u0BFF\u0C04\u0C0D\u0C11\u0C29\u0C3A-\u0C3C\u0C45\u0C49\u0C4E-\u0C54\u0C57\u0C5A-\u0C5F\u0C64\u0C65\u0C70-\u0C77\u0C80\u0C84\u0C8D\u0C91\u0CA9\u0CB4\u0CBA\u0CBB\u0CC5\u0CC9\u0CCE-\u0CD4\u0CD7-\u0CDD\u0CDF\u0CE4\u0CE5\u0CF0\u0CF3-\u0D00\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-\u0DE5\u0DF0\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\u16F9-\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\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\u1AAF\u1ABF-\u1AFF\u1B4C-\u1B4F\u1B7D-\u1B7F\u1BF4-\u1BFB\u1C38-\u1C3A\u1C4A-\u1C4C\u1C80-\u1CBF\u1CC8-\u1CCF\u1CF7\u1CFA-\u1CFF\u1DF6-\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\u2072\u2073\u208F\u209D-\u209F\u20BE-\u20CF\u20F1-\u20FF\u218A-\u218F\u23FB-\u23FF\u2427-\u243F\u244B-\u245F\u2B74\u2B75\u2B96\u2B97\u2BBA-\u2BBC\u2BC9\u2BD2-\u2BFF\u2C2F\u2C5F\u2CF4-\u2CF8\u2D26\u2D28-\u2D2C\u2D2E\u2D2F\u2D68-\u2D6E\u2D71-\u2D7E\u2D97-\u2D9F\u2DA7\u2DAF\u2DB7\u2DBF\u2DC7\u2DCF\u2DD7\u2DDF\u2E43-\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\uA69E\uA6F8-\uA6FF\uA78F\uA7AE\uA7AF\uA7B2-\uA7F6\uA82C-\uA82F\uA83A-\uA83F\uA878-\uA87F\uA8C5-\uA8CD\uA8DA-\uA8DF\uA8FC-\uA8FF\uA954-\uA95E\uA97D-\uA97F\uA9CE\uA9DA-\uA9DD\uA9FF\uAA37-\uAA3F\uAA4E\uAA4F\uAA5A\uAA5B\uAAC3-\uAADA\uAAF7-\uAB00\uAB07\uAB08\uAB0F\uAB10\uAB17-\uAB1F\uAB27\uAB2F\uAB60-\uAB63\uAB66-\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\uFE2E\uFE2F\uFE53\uFE67\uFE6C-\uFE6F\uFE75\uFEFD\uFEFE\uFF00\uFFBF-\uFFC1\uFFC8\uFFC9\uFFD0\uFFD1\uFFD8\uFFD9\uFFDD-\uFFDF\uFFE7\uFFEF-\uFFF8\uFFFE\uFFFF',
  3238. astral: '\uDB40[\uDC00\uDC02-\uDC1F\uDC80-\uDCFF\uDDF0-\uDFFF]|\uD834[\uDCF6-\uDCFF\uDD27\uDD28\uDDDE-\uDDFF\uDE46-\uDEFF\uDF57-\uDF5F\uDF72-\uDFFF]|\uD83C[\uDC2C-\uDC2F\uDC94-\uDC9F\uDCAF\uDCB0\uDCC0\uDCD0\uDCF6-\uDCFF\uDD0D-\uDD0F\uDD2F\uDD6C-\uDD6F\uDD9B-\uDDE5\uDE03-\uDE0F\uDE3B-\uDE3F\uDE49-\uDE4F\uDE52-\uDEFF\uDF2D-\uDF2F\uDF7E\uDF7F\uDFCF-\uDFD3\uDFF8-\uDFFF]|\uD83D[\uDCFF\uDD4B-\uDD4F\uDD7A\uDDA4\uDE43\uDE44\uDED0-\uDEDF\uDEED-\uDEEF\uDEF4-\uDEFF\uDF74-\uDF7F\uDFD5-\uDFFF]|\uD86D[\uDF35-\uDF3F]|\uD81B[\uDC00-\uDEFF\uDF45-\uDF4F\uDF7F-\uDF8E\uDFA0-\uDFFF]|\uD86E[\uDC1E-\uDFFF]|\uD83E[\uDC0C-\uDC0F\uDC48-\uDC4F\uDC5A-\uDC5F\uDC88-\uDC8F\uDCAE-\uDFFF]|\uD801[\uDC9E\uDC9F\uDCAA-\uDCFF\uDD28-\uDD2F\uDD64-\uDD6E\uDD70-\uDDFF\uDF37-\uDF3F\uDF56-\uDF5F\uDF68-\uDFFF]|\uD800[\uDC0C\uDC27\uDC3B\uDC3E\uDC4E\uDC4F\uDC5E-\uDC7F\uDCFB-\uDCFF\uDD03-\uDD06\uDD34-\uDD36\uDD8D-\uDD8F\uDD9C-\uDD9F\uDDA1-\uDDCF\uDDFE-\uDE7F\uDE9D-\uDE9F\uDED1-\uDEDF\uDEFC-\uDEFF\uDF24-\uDF2F\uDF4B-\uDF4F\uDF7B-\uDF7F\uDF9E\uDFC4-\uDFC7\uDFD6-\uDFFF]|\uD869[\uDED7-\uDEFF]|\uD809[\uDC6F\uDC75-\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]|\uD82F[\uDC6B-\uDC6F\uDC7D-\uDC7F\uDC89-\uDC8F\uDC9A\uDC9B\uDCA4-\uDFFF]|\uD804[\uDC4E-\uDC51\uDC70-\uDC7E\uDCC2-\uDCCF\uDCE9-\uDCEF\uDCFA-\uDCFF\uDD35\uDD44-\uDD4F\uDD77-\uDD7F\uDDC9-\uDDCC\uDDCE\uDDCF\uDDDB-\uDDE0\uDDF5-\uDDFF\uDE12\uDE3E-\uDEAF\uDEEB-\uDEEF\uDEFA-\uDF00\uDF04\uDF0D\uDF0E\uDF11\uDF12\uDF29\uDF31\uDF34\uDF3A\uDF3B\uDF45\uDF46\uDF49\uDF4A\uDF4E-\uDF56\uDF58-\uDF5C\uDF64\uDF65\uDF6D-\uDF6F\uDF75-\uDFFF]|\uD802[\uDC06\uDC07\uDC09\uDC36\uDC39-\uDC3B\uDC3D\uDC3E\uDC56\uDC9F-\uDCA6\uDCB0-\uDCFF\uDD1C-\uDD1E\uDD3A-\uDD3E\uDD40-\uDD7F\uDDB8-\uDDBD\uDDC0-\uDDFF\uDE04\uDE07-\uDE0B\uDE14\uDE18\uDE34-\uDE37\uDE3B-\uDE3E\uDE48-\uDE4F\uDE59-\uDE5F\uDEA0-\uDEBF\uDEE7-\uDEEA\uDEF7-\uDEFF\uDF36-\uDF38\uDF56\uDF57\uDF73-\uDF77\uDF92-\uDF98\uDF9D-\uDFA8\uDFB0-\uDFFF]|\uD83A[\uDCC5\uDCC6\uDCD7-\uDFFF]|\uD803[\uDC49-\uDE5F\uDE7F-\uDFFF]|\uD80D[\uDC2F-\uDFFF]|[\uD807\uD80A\uD80B\uD80E-\uD819\uD81C-\uD82B\uD82D\uD82E\uD830-\uD833\uD836-\uD839\uD83F\uD86F-\uD87D\uD87F-\uDB3F\uDB41-\uDB7F][\uDC00-\uDFFF]|\uD806[\uDC00-\uDC9F\uDCF3-\uDCFE\uDD00-\uDEBF\uDEF9-\uDFFF]|\uD81A[\uDE39-\uDE3F\uDE5F\uDE6A-\uDE6D\uDE70-\uDECF\uDEEE\uDEEF\uDEF6-\uDEFF\uDF46-\uDF4F\uDF5A\uDF62\uDF78-\uDF7C\uDF90-\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]|\uD808[\uDF99-\uDFFF]|\uD82C[\uDC02-\uDFFF]|\uD805[\uDC00-\uDC7F\uDCC8-\uDCCF\uDCDA-\uDD7F\uDDB6\uDDB7\uDDCA-\uDDFF\uDE45-\uDE4F\uDE5A-\uDE7F\uDEB8-\uDEBF\uDECA-\uDFFF]'
  3239. },
  3240. {
  3241. name: 'Co',
  3242. alias: 'Private_Use',
  3243. bmp: '\uE000-\uF8FF',
  3244. astral: '[\uDB80-\uDBBE\uDBC0-\uDBFE][\uDC00-\uDFFF]|[\uDBBF\uDBFF][\uDC00-\uDFFD]'
  3245. },
  3246. {
  3247. name: 'Cs',
  3248. alias: 'Surrogate',
  3249. bmp: '\uD800-\uDFFF'
  3250. },
  3251. {
  3252. name: 'L',
  3253. alias: 'Letter',
  3254. bmp: 'A-Za-z\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\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-\u08B2\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0980\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-\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\u16F1-\u16F8\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1877\u1880-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\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-\uA69D\uA6A0-\uA6E5\uA717-\uA71F\uA722-\uA788\uA78B-\uA78E\uA790-\uA7AD\uA7B0\uA7B1\uA7F7-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uA9E0-\uA9E4\uA9E6-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB5F\uAB64\uAB65\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',
  3255. astral: '\uD803[\uDC00-\uDC48]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDED0-\uDEED\uDF00-\uDF2F\uDF40-\uDF43\uDF63-\uDF77\uDF7D-\uDF8F]|\uD806[\uDCA0-\uDCDF\uDCFF\uDEC0-\uDEF8]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDE80-\uDE9C\uDEA0-\uDED0\uDF00-\uDF1F\uDF30-\uDF40\uDF42-\uDF49\uDF50-\uDF75\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF]|\uD87E[\uDC00-\uDE1D]|[\uD80C\uD840-\uD868\uD86A-\uD86C][\uDC00-\uDFFF]|\uD86E[\uDC00-\uDC1D]|\uD805[\uDC80-\uDCAF\uDCC4\uDCC5\uDCC7\uDD80-\uDDAE\uDE00-\uDE2F\uDE44\uDE80-\uDEAA]|\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]|\uD80D[\uDC00-\uDC2E]|\uD808[\uDC00-\uDF98]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD81B[\uDF00-\uDF44\uDF50\uDF93-\uDF9F]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD82C[\uDC00\uDC01]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00\uDE10-\uDE13\uDE15-\uDE17\uDE19-\uDE33\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE4\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD83A[\uDC00-\uDCC4]|\uD804[\uDC03-\uDC37\uDC83-\uDCAF\uDCD0-\uDCE8\uDD03-\uDD26\uDD50-\uDD72\uDD76\uDD83-\uDDB2\uDDC1-\uDDC4\uDDDA\uDE00-\uDE11\uDE13-\uDE2B\uDEB0-\uDEDE\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3D\uDF5D-\uDF61]|\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]|\uD801[\uDC00-\uDC9D\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]'
  3256. },
  3257. {
  3258. name: 'Ll',
  3259. alias: 'Lowercase_Letter',
  3260. bmp: 'a-z\xB5\xDF-\xF6\xF8-\xFF\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\u0529\u052B\u052D\u052F\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\uA699\uA69B\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-\uA795\uA797\uA799\uA79B\uA79D\uA79F\uA7A1\uA7A3\uA7A5\uA7A7\uA7A9\uA7FA\uAB30-\uAB5A\uAB64\uAB65\uFB00-\uFB06\uFB13-\uFB17\uFF41-\uFF5A',
  3261. 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]|\uD806[\uDCC0-\uDCDF]'
  3262. },
  3263. {
  3264. name: 'Lm',
  3265. alias: 'Modifier_Letter',
  3266. 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\uA69C\uA69D\uA717-\uA71F\uA770\uA788\uA7F8\uA7F9\uA9CF\uA9E6\uAA70\uAADD\uAAF3\uAAF4\uAB5C-\uAB5F\uFF70\uFF9E\uFF9F',
  3267. astral: '\uD81A[\uDF40-\uDF43]|\uD81B[\uDF93-\uDF9F]'
  3268. },
  3269. {
  3270. name: 'Lo',
  3271. alias: 'Other_Letter',
  3272. bmp: '\xAA\xBA\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-\u08B2\u0904-\u0939\u093D\u0950\u0958-\u0961\u0972-\u0980\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-\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\u16F1-\u16F8\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-\u191E\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\uA7F7\uA7FB-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9E0-\uA9E4\uA9E7-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA6F\uAA71-\uAA76\uAA7A\uAA7E-\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',
  3273. astral: '\uD803[\uDC00-\uDC48]|\uD806[\uDCFF\uDEC0-\uDEF8]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDE80-\uDE9C\uDEA0-\uDED0\uDF00-\uDF1F\uDF30-\uDF40\uDF42-\uDF49\uDF50-\uDF75\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDED0-\uDEED\uDF00-\uDF2F\uDF63-\uDF77\uDF7D-\uDF8F]|[\uD80C\uD840-\uD868\uD86A-\uD86C][\uDC00-\uDFFF]|\uD801[\uDC50-\uDC9D\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD86E[\uDC00-\uDC1D]|\uD805[\uDC80-\uDCAF\uDCC4\uDCC5\uDCC7\uDD80-\uDDAE\uDE00-\uDE2F\uDE44\uDE80-\uDEAA]|\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]|\uD80D[\uDC00-\uDC2E]|\uD808[\uDC00-\uDF98]|\uD87E[\uDC00-\uDE1D]|\uD81B[\uDF00-\uDF44\uDF50]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD82C[\uDC00\uDC01]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00\uDE10-\uDE13\uDE15-\uDE17\uDE19-\uDE33\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE4\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD83A[\uDC00-\uDCC4]|\uD804[\uDC03-\uDC37\uDC83-\uDCAF\uDCD0-\uDCE8\uDD03-\uDD26\uDD50-\uDD72\uDD76\uDD83-\uDDB2\uDDC1-\uDDC4\uDDDA\uDE00-\uDE11\uDE13-\uDE2B\uDEB0-\uDEDE\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3D\uDF5D-\uDF61]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]'
  3274. },
  3275. {
  3276. name: 'Lt',
  3277. alias: 'Titlecase_Letter',
  3278. bmp: '\u01C5\u01C8\u01CB\u01F2\u1F88-\u1F8F\u1F98-\u1F9F\u1FA8-\u1FAF\u1FBC\u1FCC\u1FFC'
  3279. },
  3280. {
  3281. name: 'Lu',
  3282. alias: 'Uppercase_Letter',
  3283. bmp: 'A-Z\xC0-\xD6\xD8-\xDE\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\u037F\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\u0528\u052A\u052C\u052E\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\uA698\uA69A\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\uA796\uA798\uA79A\uA79C\uA79E\uA7A0\uA7A2\uA7A4\uA7A6\uA7A8\uA7AA-\uA7AD\uA7B0\uA7B1\uFF21-\uFF3A',
  3284. astral: '\uD806[\uDCA0-\uDCBF]|\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]'
  3285. },
  3286. {
  3287. name: 'M',
  3288. alias: 'Mark',
  3289. 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-\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\u0C00-\u0C03\u0C3E-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55\u0C56\u0C62\u0C63\u0C81-\u0C83\u0CBC\u0CBE-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5\u0CD6\u0CE2\u0CE3\u0D01-\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\u1AB0-\u1ABE\u1B00-\u1B04\u1B34-\u1B44\u1B6B-\u1B73\u1B80-\u1B82\u1BA1-\u1BAD\u1BE6-\u1BF3\u1C24-\u1C37\u1CD0-\u1CD2\u1CD4-\u1CE8\u1CED\u1CF2-\u1CF4\u1CF8\u1CF9\u1DC0-\u1DF5\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\uA9E5\uAA29-\uAA36\uAA43\uAA4C\uAA4D\uAA7B-\uAA7D\uAAB0\uAAB2-\uAAB4\uAAB7\uAAB8\uAABE\uAABF\uAAC1\uAAEB-\uAAEF\uAAF5\uAAF6\uABE3-\uABEA\uABEC\uABED\uFB1E\uFE00-\uFE0F\uFE20-\uFE2D',
  3290. astral: '\uD834[\uDD65-\uDD69\uDD6D-\uDD72\uDD7B-\uDD82\uDD85-\uDD8B\uDDAA-\uDDAD\uDE42-\uDE44]|\uD804[\uDC00-\uDC02\uDC38-\uDC46\uDC7F-\uDC82\uDCB0-\uDCBA\uDD00-\uDD02\uDD27-\uDD34\uDD73\uDD80-\uDD82\uDDB3-\uDDC0\uDE2C-\uDE37\uDEDF-\uDEEA\uDF01-\uDF03\uDF3C\uDF3E-\uDF44\uDF47\uDF48\uDF4B-\uDF4D\uDF57\uDF62\uDF63\uDF66-\uDF6C\uDF70-\uDF74]|\uD81B[\uDF51-\uDF7E\uDF8F-\uDF92]|\uD81A[\uDEF0-\uDEF4\uDF30-\uDF36]|\uD82F[\uDC9D\uDC9E]|\uD800[\uDDFD\uDEE0\uDF76-\uDF7A]|\uD805[\uDCB0-\uDCC3\uDDAF-\uDDB5\uDDB8-\uDDC0\uDE30-\uDE40\uDEAB-\uDEB7]|\uD802[\uDE01-\uDE03\uDE05\uDE06\uDE0C-\uDE0F\uDE38-\uDE3A\uDE3F\uDEE5\uDEE6]|\uD83A[\uDCD0-\uDCD6]|\uDB40[\uDD00-\uDDEF]'
  3291. },
  3292. {
  3293. name: 'Mc',
  3294. alias: 'Spacing_Mark',
  3295. 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\u1A1A\u1A55\u1A57\u1A61\u1A63\u1A64\u1A6D-\u1A72\u1B04\u1B35\u1B3B\u1B3D-\u1B41\u1B43\u1B44\u1B82\u1BA1\u1BA6\u1BA7\u1BAA\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\uAA7D\uAAEB\uAAEE\uAAEF\uAAF5\uABE3\uABE4\uABE6\uABE7\uABE9\uABEA\uABEC',
  3296. astral: '\uD834[\uDD65\uDD66\uDD6D-\uDD72]|\uD805[\uDCB0-\uDCB2\uDCB9\uDCBB-\uDCBE\uDCC1\uDDAF-\uDDB1\uDDB8-\uDDBB\uDDBE\uDE30-\uDE32\uDE3B\uDE3C\uDE3E\uDEAC\uDEAE\uDEAF\uDEB6]|\uD804[\uDC00\uDC02\uDC82\uDCB0-\uDCB2\uDCB7\uDCB8\uDD2C\uDD82\uDDB3-\uDDB5\uDDBF\uDDC0\uDE2C-\uDE2E\uDE32\uDE33\uDE35\uDEE0-\uDEE2\uDF02\uDF03\uDF3E\uDF3F\uDF41-\uDF44\uDF47\uDF48\uDF4B-\uDF4D\uDF57\uDF62\uDF63]|\uD81B[\uDF51-\uDF7E]'
  3297. },
  3298. {
  3299. name: 'Me',
  3300. alias: 'Enclosing_Mark',
  3301. bmp: '\u0488\u0489\u1ABE\u20DD-\u20E0\u20E2-\u20E4\uA670-\uA672'
  3302. },
  3303. {
  3304. name: 'Mn',
  3305. alias: 'Nonspacing_Mark',
  3306. 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-\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\u0C00\u0C3E-\u0C40\u0C46-\u0C48\u0C4A-\u0C4D\u0C55\u0C56\u0C62\u0C63\u0C81\u0CBC\u0CBF\u0CC6\u0CCC\u0CCD\u0CE2\u0CE3\u0D01\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\u1A1B\u1A56\u1A58-\u1A5E\u1A60\u1A62\u1A65-\u1A6C\u1A73-\u1A7C\u1A7F\u1AB0-\u1ABD\u1B00-\u1B03\u1B34\u1B36-\u1B3A\u1B3C\u1B42\u1B6B-\u1B73\u1B80\u1B81\u1BA2-\u1BA5\u1BA8\u1BA9\u1BAB-\u1BAD\u1BE6\u1BE8\u1BE9\u1BED\u1BEF-\u1BF1\u1C2C-\u1C33\u1C36\u1C37\u1CD0-\u1CD2\u1CD4-\u1CE0\u1CE2-\u1CE8\u1CED\u1CF4\u1CF8\u1CF9\u1DC0-\u1DF5\u1DFC-\u1DFF\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\uA9E5\uAA29-\uAA2E\uAA31\uAA32\uAA35\uAA36\uAA43\uAA4C\uAA7C\uAAB0\uAAB2-\uAAB4\uAAB7\uAAB8\uAABE\uAABF\uAAC1\uAAEC\uAAED\uAAF6\uABE5\uABE8\uABED\uFB1E\uFE00-\uFE0F\uFE20-\uFE2D',
  3307. astral: '\uD804[\uDC01\uDC38-\uDC46\uDC7F-\uDC81\uDCB3-\uDCB6\uDCB9\uDCBA\uDD00-\uDD02\uDD27-\uDD2B\uDD2D-\uDD34\uDD73\uDD80\uDD81\uDDB6-\uDDBE\uDE2F-\uDE31\uDE34\uDE36\uDE37\uDEDF\uDEE3-\uDEEA\uDF01\uDF3C\uDF40\uDF66-\uDF6C\uDF70-\uDF74]|\uD805[\uDCB3-\uDCB8\uDCBA\uDCBF\uDCC0\uDCC2\uDCC3\uDDB2-\uDDB5\uDDBC\uDDBD\uDDBF\uDDC0\uDE33-\uDE3A\uDE3D\uDE3F\uDE40\uDEAB\uDEAD\uDEB0-\uDEB5\uDEB7]|\uD834[\uDD67-\uDD69\uDD7B-\uDD82\uDD85-\uDD8B\uDDAA-\uDDAD\uDE42-\uDE44]|\uD81A[\uDEF0-\uDEF4\uDF30-\uDF36]|\uD81B[\uDF8F-\uDF92]|\uD82F[\uDC9D\uDC9E]|\uD800[\uDDFD\uDEE0\uDF76-\uDF7A]|\uD802[\uDE01-\uDE03\uDE05\uDE06\uDE0C-\uDE0F\uDE38-\uDE3A\uDE3F\uDEE5\uDEE6]|\uD83A[\uDCD0-\uDCD6]|\uDB40[\uDD00-\uDDEF]'
  3308. },
  3309. {
  3310. name: 'N',
  3311. alias: 'Number',
  3312. bmp: '0-9\xB2\xB3\xB9\xBC-\xBE\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\u0DE6-\u0DEF\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\uA9F0-\uA9F9\uAA50-\uAA59\uABF0-\uABF9\uFF10-\uFF19',
  3313. astral: '\uD800[\uDD07-\uDD33\uDD40-\uDD78\uDD8A\uDD8B\uDEE1-\uDEFB\uDF20-\uDF23\uDF41\uDF4A\uDFD1-\uDFD5]|\uD801[\uDCA0-\uDCA9]|\uD83C[\uDD00-\uDD0C]|\uD835[\uDFCE-\uDFFF]|\uD83A[\uDCC7-\uDCCF]|\uD81A[\uDE60-\uDE69\uDF50-\uDF59\uDF5B-\uDF61]|\uD805[\uDCD0-\uDCD9\uDE50-\uDE59\uDEC0-\uDEC9]|\uD806[\uDCE0-\uDCF2]|\uD804[\uDC52-\uDC6F\uDCF0-\uDCF9\uDD36-\uDD3F\uDDD0-\uDDD9\uDDE1-\uDDF4\uDEF0-\uDEF9]|\uD803[\uDE60-\uDE7E]|\uD802[\uDC58-\uDC5F\uDC79-\uDC7F\uDCA7-\uDCAF\uDD16-\uDD1B\uDE40-\uDE47\uDE7D\uDE7E\uDE9D-\uDE9F\uDEEB-\uDEEF\uDF58-\uDF5F\uDF78-\uDF7F\uDFA9-\uDFAF]|\uD809[\uDC00-\uDC6E]|\uD834[\uDF60-\uDF71]'
  3314. },
  3315. {
  3316. name: 'Nd',
  3317. alias: 'Decimal_Number',
  3318. 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\u0DE6-\u0DEF\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\uA9F0-\uA9F9\uAA50-\uAA59\uABF0-\uABF9\uFF10-\uFF19',
  3319. astral: '\uD806[\uDCE0-\uDCE9]|\uD835[\uDFCE-\uDFFF]|\uD805[\uDCD0-\uDCD9\uDE50-\uDE59\uDEC0-\uDEC9]|\uD804[\uDC66-\uDC6F\uDCF0-\uDCF9\uDD36-\uDD3F\uDDD0-\uDDD9\uDEF0-\uDEF9]|\uD801[\uDCA0-\uDCA9]|\uD81A[\uDE60-\uDE69\uDF50-\uDF59]'
  3320. },
  3321. {
  3322. name: 'Nl',
  3323. alias: 'Letter_Number',
  3324. bmp: '\u16EE-\u16F0\u2160-\u2182\u2185-\u2188\u3007\u3021-\u3029\u3038-\u303A\uA6E6-\uA6EF',
  3325. astral: '\uD809[\uDC00-\uDC6E]|\uD800[\uDD40-\uDD74\uDF41\uDF4A\uDFD1-\uDFD5]'
  3326. },
  3327. {
  3328. name: 'No',
  3329. alias: 'Other_Number',
  3330. bmp: '\xB2\xB3\xB9\xBC-\xBE\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',
  3331. astral: '\uD804[\uDC52-\uDC65\uDDE1-\uDDF4]|\uD83C[\uDD00-\uDD0C]|\uD806[\uDCEA-\uDCF2]|\uD83A[\uDCC7-\uDCCF]|\uD834[\uDF60-\uDF71]|\uD803[\uDE60-\uDE7E]|\uD802[\uDC58-\uDC5F\uDC79-\uDC7F\uDCA7-\uDCAF\uDD16-\uDD1B\uDE40-\uDE47\uDE7D\uDE7E\uDE9D-\uDE9F\uDEEB-\uDEEF\uDF58-\uDF5F\uDF78-\uDF7F\uDFA9-\uDFAF]|\uD81A[\uDF5B-\uDF61]|\uD800[\uDD07-\uDD33\uDD75-\uDD78\uDD8A\uDD8B\uDEE1-\uDEFB\uDF20-\uDF23]'
  3332. },
  3333. {
  3334. name: 'P',
  3335. alias: 'Punctuation',
  3336. bmp: '\x21-\x23\x25-\\x2A\x2C-\x2F\x3A\x3B\\x3F\x40\\x5B-\\x5D\x5F\\x7B\x7D\xA1\xA7\xAB\xB6\xB7\xBB\xBF\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\u2308-\u230B\u2329\u232A\u2768-\u2775\u27C5\u27C6\u27E6-\u27EF\u2983-\u2998\u29D8-\u29DB\u29FC\u29FD\u2CF9-\u2CFC\u2CFE\u2CFF\u2D70\u2E00-\u2E2E\u2E30-\u2E42\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',
  3337. astral: '\uD802[\uDC57\uDD1F\uDD3F\uDE50-\uDE58\uDE7F\uDEF0-\uDEF6\uDF39-\uDF3F\uDF99-\uDF9C]|\uD804[\uDC47-\uDC4D\uDCBB\uDCBC\uDCBE-\uDCC1\uDD40-\uDD43\uDD74\uDD75\uDDC5-\uDDC8\uDDCD\uDE38-\uDE3D]|\uD809[\uDC70-\uDC74]|\uD805[\uDCC6\uDDC1-\uDDC9\uDE41-\uDE43]|\uD801\uDD6F|\uD82F\uDC9F|\uD800[\uDD00-\uDD02\uDF9F\uDFD0]|\uD81A[\uDE6E\uDE6F\uDEF5\uDF37-\uDF3B\uDF44]'
  3338. },
  3339. {
  3340. name: 'Pc',
  3341. alias: 'Connector_Punctuation',
  3342. bmp: '\x5F\u203F\u2040\u2054\uFE33\uFE34\uFE4D-\uFE4F\uFF3F'
  3343. },
  3344. {
  3345. name: 'Pd',
  3346. alias: 'Dash_Punctuation',
  3347. bmp: '\\x2D\u058A\u05BE\u1400\u1806\u2010-\u2015\u2E17\u2E1A\u2E3A\u2E3B\u2E40\u301C\u3030\u30A0\uFE31\uFE32\uFE58\uFE63\uFF0D'
  3348. },
  3349. {
  3350. name: 'Pe',
  3351. alias: 'Close_Punctuation',
  3352. bmp: '\\x29\\x5D\x7D\u0F3B\u0F3D\u169C\u2046\u207E\u208E\u2309\u230B\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\uFD3E\uFE18\uFE36\uFE38\uFE3A\uFE3C\uFE3E\uFE40\uFE42\uFE44\uFE48\uFE5A\uFE5C\uFE5E\uFF09\uFF3D\uFF5D\uFF60\uFF63'
  3353. },
  3354. {
  3355. name: 'Pf',
  3356. alias: 'Final_Punctuation',
  3357. bmp: '\xBB\u2019\u201D\u203A\u2E03\u2E05\u2E0A\u2E0D\u2E1D\u2E21'
  3358. },
  3359. {
  3360. name: 'Pi',
  3361. alias: 'Initial_Punctuation',
  3362. bmp: '\xAB\u2018\u201B\u201C\u201F\u2039\u2E02\u2E04\u2E09\u2E0C\u2E1C\u2E20'
  3363. },
  3364. {
  3365. name: 'Po',
  3366. alias: 'Other_Punctuation',
  3367. bmp: '\x21-\x23\x25-\x27\\x2A\x2C\\x2E\x2F\x3A\x3B\\x3F\x40\\x5C\xA1\xA7\xB6\xB7\xBF\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\u2E3C-\u2E3F\u2E41\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',
  3368. astral: '\uD802[\uDC57\uDD1F\uDD3F\uDE50-\uDE58\uDE7F\uDEF0-\uDEF6\uDF39-\uDF3F\uDF99-\uDF9C]|\uD804[\uDC47-\uDC4D\uDCBB\uDCBC\uDCBE-\uDCC1\uDD40-\uDD43\uDD74\uDD75\uDDC5-\uDDC8\uDDCD\uDE38-\uDE3D]|\uD809[\uDC70-\uDC74]|\uD805[\uDCC6\uDDC1-\uDDC9\uDE41-\uDE43]|\uD801\uDD6F|\uD82F\uDC9F|\uD800[\uDD00-\uDD02\uDF9F\uDFD0]|\uD81A[\uDE6E\uDE6F\uDEF5\uDF37-\uDF3B\uDF44]'
  3369. },
  3370. {
  3371. name: 'Ps',
  3372. alias: 'Open_Punctuation',
  3373. bmp: '\\x28\\x5B\\x7B\u0F3A\u0F3C\u169B\u201A\u201E\u2045\u207D\u208D\u2308\u230A\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\u2E42\u3008\u300A\u300C\u300E\u3010\u3014\u3016\u3018\u301A\u301D\uFD3F\uFE17\uFE35\uFE37\uFE39\uFE3B\uFE3D\uFE3F\uFE41\uFE43\uFE47\uFE59\uFE5B\uFE5D\uFF08\uFF3B\uFF5B\uFF5F\uFF62'
  3374. },
  3375. {
  3376. name: 'S',
  3377. alias: 'Symbol',
  3378. bmp: '\\x24\\x2B\x3C-\x3E\\x5E\x60\\x7C\x7E\xA2-\xA6\xA8\xA9\xAC\xAE-\xB1\xB4\xB8\xD7\xF7\u02C2-\u02C5\u02D2-\u02DF\u02E5-\u02EB\u02ED\u02EF-\u02FF\u0375\u0384\u0385\u03F6\u0482\u058D-\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-\u20BD\u2100\u2101\u2103-\u2106\u2108\u2109\u2114\u2116-\u2118\u211E-\u2123\u2125\u2127\u2129\u212E\u213A\u213B\u2140-\u2144\u214A-\u214D\u214F\u2190-\u2307\u230C-\u2328\u232B-\u23FA\u2400-\u2426\u2440-\u244A\u249C-\u24E9\u2500-\u2767\u2794-\u27C4\u27C7-\u27E5\u27F0-\u2982\u2999-\u29D7\u29DC-\u29FB\u29FE-\u2B73\u2B76-\u2B95\u2B98-\u2BB9\u2BBD-\u2BC8\u2BCA-\u2BD1\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\uAB5B\uFB29\uFBB2-\uFBC1\uFDFC\uFDFD\uFE62\uFE64-\uFE66\uFE69\uFF04\uFF0B\uFF1C-\uFF1E\uFF3E\uFF40\uFF5C\uFF5E\uFFE0-\uFFE6\uFFE8-\uFFEE\uFFFC\uFFFD',
  3379. astral: '\uD83C[\uDC00-\uDC2B\uDC30-\uDC93\uDCA0-\uDCAE\uDCB1-\uDCBF\uDCC1-\uDCCF\uDCD1-\uDCF5\uDD10-\uDD2E\uDD30-\uDD6B\uDD70-\uDD9A\uDDE6-\uDE02\uDE10-\uDE3A\uDE40-\uDE48\uDE50\uDE51\uDF00-\uDF2C\uDF30-\uDF7D\uDF80-\uDFCE\uDFD4-\uDFF7]|\uD835[\uDEC1\uDEDB\uDEFB\uDF15\uDF35\uDF4F\uDF6F\uDF89\uDFA9\uDFC3]|\uD800[\uDD37-\uDD3F\uDD79-\uDD89\uDD8C\uDD90-\uDD9B\uDDA0\uDDD0-\uDDFC]|\uD82F\uDC9C|\uD83B[\uDEF0\uDEF1]|\uD802[\uDC77\uDC78\uDEC8]|\uD81A[\uDF3C-\uDF3F\uDF45]|\uD834[\uDC00-\uDCF5\uDD00-\uDD26\uDD29-\uDD64\uDD6A-\uDD6C\uDD83\uDD84\uDD8C-\uDDA9\uDDAE-\uDDDD\uDE00-\uDE41\uDE45\uDF00-\uDF56]|\uD83E[\uDC00-\uDC0B\uDC10-\uDC47\uDC50-\uDC59\uDC60-\uDC87\uDC90-\uDCAD]|\uD83D[\uDC00-\uDCFE\uDD00-\uDD4A\uDD50-\uDD79\uDD7B-\uDDA3\uDDA5-\uDE42\uDE45-\uDECF\uDEE0-\uDEEC\uDEF0-\uDEF3\uDF00-\uDF73\uDF80-\uDFD4]'
  3380. },
  3381. {
  3382. name: 'Sc',
  3383. alias: 'Currency_Symbol',
  3384. bmp: '\\x24\xA2-\xA5\u058F\u060B\u09F2\u09F3\u09FB\u0AF1\u0BF9\u0E3F\u17DB\u20A0-\u20BD\uA838\uFDFC\uFE69\uFF04\uFFE0\uFFE1\uFFE5\uFFE6'
  3385. },
  3386. {
  3387. name: 'Sk',
  3388. alias: 'Modifier_Symbol',
  3389. bmp: '\\x5E\x60\xA8\xAF\xB4\xB8\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\uAB5B\uFBB2-\uFBC1\uFF3E\uFF40\uFFE3'
  3390. },
  3391. {
  3392. name: 'Sm',
  3393. alias: 'Math_Symbol',
  3394. bmp: '\\x2B\x3C-\x3E\\x7C\x7E\xAC\xB1\xD7\xF7\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\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',
  3395. astral: '\uD83B[\uDEF0\uDEF1]|\uD835[\uDEC1\uDEDB\uDEFB\uDF15\uDF35\uDF4F\uDF6F\uDF89\uDFA9\uDFC3]'
  3396. },
  3397. {
  3398. name: 'So',
  3399. alias: 'Other_Symbol',
  3400. bmp: '\xA6\xA9\xAE\xB0\u0482\u058D\u058E\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-\u23FA\u2400-\u2426\u2440-\u244A\u249C-\u24E9\u2500-\u25B6\u25B8-\u25C0\u25C2-\u25F7\u2600-\u266E\u2670-\u2767\u2794-\u27BF\u2800-\u28FF\u2B00-\u2B2F\u2B45\u2B46\u2B4D-\u2B73\u2B76-\u2B95\u2B98-\u2BB9\u2BBD-\u2BC8\u2BCA-\u2BD1\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',
  3401. astral: '\uD83C[\uDC00-\uDC2B\uDC30-\uDC93\uDCA0-\uDCAE\uDCB1-\uDCBF\uDCC1-\uDCCF\uDCD1-\uDCF5\uDD10-\uDD2E\uDD30-\uDD6B\uDD70-\uDD9A\uDDE6-\uDE02\uDE10-\uDE3A\uDE40-\uDE48\uDE50\uDE51\uDF00-\uDF2C\uDF30-\uDF7D\uDF80-\uDFCE\uDFD4-\uDFF7]|\uD800[\uDD37-\uDD3F\uDD79-\uDD89\uDD8C\uDD90-\uDD9B\uDDA0\uDDD0-\uDDFC]|\uD82F\uDC9C|\uD802[\uDC77\uDC78\uDEC8]|\uD81A[\uDF3C-\uDF3F\uDF45]|\uD834[\uDC00-\uDCF5\uDD00-\uDD26\uDD29-\uDD64\uDD6A-\uDD6C\uDD83\uDD84\uDD8C-\uDDA9\uDDAE-\uDDDD\uDE00-\uDE41\uDE45\uDF00-\uDF56]|\uD83E[\uDC00-\uDC0B\uDC10-\uDC47\uDC50-\uDC59\uDC60-\uDC87\uDC90-\uDCAD]|\uD83D[\uDC00-\uDCFE\uDD00-\uDD4A\uDD50-\uDD79\uDD7B-\uDDA3\uDDA5-\uDE42\uDE45-\uDECF\uDEE0-\uDEEC\uDEF0-\uDEF3\uDF00-\uDF73\uDF80-\uDFD4]'
  3402. },
  3403. {
  3404. name: 'Z',
  3405. alias: 'Separator',
  3406. bmp: '\x20\xA0\u1680\u2000-\u200A\u2028\u2029\u202F\u205F\u3000'
  3407. },
  3408. {
  3409. name: 'Zl',
  3410. alias: 'Line_Separator',
  3411. bmp: '\u2028'
  3412. },
  3413. {
  3414. name: 'Zp',
  3415. alias: 'Paragraph_Separator',
  3416. bmp: '\u2029'
  3417. },
  3418. {
  3419. name: 'Zs',
  3420. alias: 'Space_Separator',
  3421. bmp: '\x20\xA0\u1680\u2000-\u200A\u202F\u205F\u3000'
  3422. }
  3423. ]);
  3424. }(XRegExp));
  3425. /*!
  3426. * XRegExp Unicode Properties 3.0.0-pre
  3427. * <http://xregexp.com/>
  3428. * Steven Levithan (c) 2012-2015 MIT License
  3429. * Unicode data provided by Mathias Bynens <http://mathiasbynens.be/>
  3430. */
  3431. /**
  3432. * Adds Level 1 Unicode properties (detailed in UTS #18 RL1.2). Token names are case insensitive,
  3433. * and any spaces, hyphens, and underscores are ignored.
  3434. *
  3435. * Uses Unicode 7.0.0.
  3436. *
  3437. * @requires XRegExp, Unicode Base
  3438. */
  3439. (function(XRegExp) {
  3440. 'use strict';
  3441. if (!XRegExp.addUnicodeData) {
  3442. throw new ReferenceError('Unicode Base must be loaded before Unicode Properties');
  3443. }
  3444. XRegExp.addUnicodeData([
  3445. {
  3446. name: 'ASCII',
  3447. bmp: '\0-\x7F'
  3448. },
  3449. {
  3450. name: 'Alphabetic',
  3451. bmp: 'A-Za-z\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\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',
  3452. 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]'
  3453. },
  3454. {
  3455. name: 'Any',
  3456. isBmpLast: true,
  3457. bmp: '\0-\uFFFF',
  3458. astral: '[\uD800-\uDBFF][\uDC00-\uDFFF]'
  3459. },
  3460. {
  3461. name: 'Assigned',
  3462. // Since this is defined as the inverse of Unicode category Cn (Unassigned), the Unicode
  3463. // Categories addon is required to use this property
  3464. inverseOf: 'Cn'
  3465. },
  3466. {
  3467. name: 'Default_Ignorable_Code_Point',
  3468. bmp: '\xAD\u034F\u115F\u1160\u17B4\u17B5\u180B-\u180D\u200B-\u200F\u202A-\u202E\u2060-\u206F\u3164\uFE00-\uFE0F\uFEFF\uFFA0\uFFF0-\uFFF8',
  3469. astral: '[\uDB40-\uDB43][\uDC00-\uDFFF]|\uD834[\uDD73-\uDD7A]'
  3470. },
  3471. {
  3472. name: 'Lowercase',
  3473. bmp: 'a-z\xAA\xB5\xBA\xDF-\xF6\xF8-\xFF\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',
  3474. 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]'
  3475. },
  3476. {
  3477. name: 'Noncharacter_Code_Point',
  3478. bmp: '\uFDD0-\uFDEF\uFFFE\uFFFF',
  3479. astral: '[\uDB3F\uDB7F\uDBBF\uDBFF\uD83F\uD87F\uD8BF\uDAFF\uD97F\uD9BF\uD9FF\uDA3F\uD8FF\uDABF\uDA7F\uD93F][\uDFFE\uDFFF]'
  3480. },
  3481. {
  3482. name: 'Uppercase',
  3483. bmp: 'A-Z\xC0-\xD6\xD8-\xDE\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',
  3484. 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]'
  3485. },
  3486. {
  3487. name: 'White_Space',
  3488. bmp: '\x09-\x0D\x20\x85\xA0\u1680\u180E\u2000-\u200A\u2028\u2029\u202F\u205F\u3000'
  3489. }
  3490. ]);
  3491. }(XRegExp));
  3492. /*!
  3493. * XRegExp Unicode Scripts 3.0.0-pre
  3494. * <http://xregexp.com/>
  3495. * Steven Levithan (c) 2010-2015 MIT License
  3496. * Unicode data provided by Mathias Bynens <http://mathiasbynens.be/>
  3497. */
  3498. /**
  3499. * Adds support for all Unicode scripts. E.g., `\p{Latin}`. Token names are case insensitive, and
  3500. * any spaces, hyphens, and underscores are ignored.
  3501. *
  3502. * Uses Unicode 7.0.0.
  3503. *
  3504. * @requires XRegExp, Unicode Base
  3505. */
  3506. (function(XRegExp) {
  3507. 'use strict';
  3508. if (!XRegExp.addUnicodeData) {
  3509. throw new ReferenceError('Unicode Base must be loaded before Unicode Scripts');
  3510. }
  3511. XRegExp.addUnicodeData([
  3512. {
  3513. name: 'Arabic',
  3514. bmp: '\u0600-\u0604\u0606-\u060B\u060D-\u061A\u061E\u0620-\u063F\u0641-\u064A\u0656-\u065F\u066A-\u066F\u0671-\u06DC\u06DE-\u06FF\u0750-\u077F\u08A0-\u08B2\u08E4-\u08FF\uFB50-\uFBC1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFD\uFE70-\uFE74\uFE76-\uFEFC',
  3515. 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]'
  3516. },
  3517. {
  3518. name: 'Armenian',
  3519. bmp: '\u0531-\u0556\u0559-\u055F\u0561-\u0587\u058A\u058D-\u058F\uFB13-\uFB17'
  3520. },
  3521. {
  3522. name: 'Avestan',
  3523. astral: '\uD802[\uDF00-\uDF35\uDF39-\uDF3F]'
  3524. },
  3525. {
  3526. name: 'Balinese',
  3527. bmp: '\u1B00-\u1B4B\u1B50-\u1B7C'
  3528. },
  3529. {
  3530. name: 'Bamum',
  3531. bmp: '\uA6A0-\uA6F7',
  3532. astral: '\uD81A[\uDC00-\uDE38]'
  3533. },
  3534. {
  3535. name: 'Bassa_Vah',
  3536. astral: '\uD81A[\uDED0-\uDEED\uDEF0-\uDEF5]'
  3537. },
  3538. {
  3539. name: 'Batak',
  3540. bmp: '\u1BC0-\u1BF3\u1BFC-\u1BFF'
  3541. },
  3542. {
  3543. name: 'Bengali',
  3544. bmp: '\u0980-\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'
  3545. },
  3546. {
  3547. name: 'Bopomofo',
  3548. bmp: '\u02EA\u02EB\u3105-\u312D\u31A0-\u31BA'
  3549. },
  3550. {
  3551. name: 'Brahmi',
  3552. astral: '\uD804[\uDC00-\uDC4D\uDC52-\uDC6F\uDC7F]'
  3553. },
  3554. {
  3555. name: 'Braille',
  3556. bmp: '\u2800-\u28FF'
  3557. },
  3558. {
  3559. name: 'Buginese',
  3560. bmp: '\u1A00-\u1A1B\u1A1E\u1A1F'
  3561. },
  3562. {
  3563. name: 'Buhid',
  3564. bmp: '\u1740-\u1753'
  3565. },
  3566. {
  3567. name: 'Canadian_Aboriginal',
  3568. bmp: '\u1400-\u167F\u18B0-\u18F5'
  3569. },
  3570. {
  3571. name: 'Carian',
  3572. astral: '\uD800[\uDEA0-\uDED0]'
  3573. },
  3574. {
  3575. name: 'Caucasian_Albanian',
  3576. astral: '\uD801[\uDD30-\uDD63\uDD6F]'
  3577. },
  3578. {
  3579. name: 'Chakma',
  3580. astral: '\uD804[\uDD00-\uDD34\uDD36-\uDD43]'
  3581. },
  3582. {
  3583. name: 'Cham',
  3584. bmp: '\uAA00-\uAA36\uAA40-\uAA4D\uAA50-\uAA59\uAA5C-\uAA5F'
  3585. },
  3586. {
  3587. name: 'Cherokee',
  3588. bmp: '\u13A0-\u13F4'
  3589. },
  3590. {
  3591. name: 'Common',
  3592. bmp: '\0-\x40\\x5B-\x60\\x7B-\xA9\xAB-\xB9\xBB-\xBF\xD7\xF7\u02B9-\u02DF\u02E5-\u02E9\u02EC-\u02FF\u0374\u037E\u0385\u0387\u0589\u0605\u060C\u061B\u061C\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\u2066-\u2070\u2074-\u207E\u2080-\u208E\u20A0-\u20BD\u2100-\u2125\u2127-\u2129\u212C-\u2131\u2133-\u214D\u214F-\u215F\u2189\u2190-\u23FA\u2400-\u2426\u2440-\u244A\u2460-\u27FF\u2900-\u2B73\u2B76-\u2B95\u2B98-\u2BB9\u2BBD-\u2BC8\u2BCA-\u2BD1\u2E00-\u2E42\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\uA92E\uA9CF\uAB5B\uFD3E\uFD3F\uFE10-\uFE19\uFE30-\uFE52\uFE54-\uFE66\uFE68-\uFE6B\uFEFF\uFF01-\uFF20\uFF3B-\uFF40\uFF5B-\uFF65\uFF70\uFF9E\uFF9F\uFFE0-\uFFE6\uFFE8-\uFFEE\uFFF9-\uFFFD',
  3593. astral: '\uD82F[\uDCA0-\uDCA3]|\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]|\uDB40[\uDC01\uDC20-\uDC7F]|\uD800[\uDD00-\uDD02\uDD07-\uDD33\uDD37-\uDD3F\uDD90-\uDD9B\uDDD0-\uDDFC\uDEE1-\uDEFB]|\uD834[\uDC00-\uDCF5\uDD00-\uDD26\uDD29-\uDD66\uDD6A-\uDD7A\uDD83\uDD84\uDD8C-\uDDA9\uDDAE-\uDDDD\uDF00-\uDF56\uDF60-\uDF71]|\uD83C[\uDC00-\uDC2B\uDC30-\uDC93\uDCA0-\uDCAE\uDCB1-\uDCBF\uDCC1-\uDCCF\uDCD1-\uDCF5\uDD00-\uDD0C\uDD10-\uDD2E\uDD30-\uDD6B\uDD70-\uDD9A\uDDE6-\uDDFF\uDE01\uDE02\uDE10-\uDE3A\uDE40-\uDE48\uDE50\uDE51\uDF00-\uDF2C\uDF30-\uDF7D\uDF80-\uDFCE\uDFD4-\uDFF7]|\uD83E[\uDC00-\uDC0B\uDC10-\uDC47\uDC50-\uDC59\uDC60-\uDC87\uDC90-\uDCAD]|\uD83D[\uDC00-\uDCFE\uDD00-\uDD4A\uDD50-\uDD79\uDD7B-\uDDA3\uDDA5-\uDE42\uDE45-\uDECF\uDEE0-\uDEEC\uDEF0-\uDEF3\uDF00-\uDF73\uDF80-\uDFD4]'
  3594. },
  3595. {
  3596. name: 'Coptic',
  3597. bmp: '\u03E2-\u03EF\u2C80-\u2CF3\u2CF9-\u2CFF'
  3598. },
  3599. {
  3600. name: 'Cuneiform',
  3601. astral: '\uD808[\uDC00-\uDF98]|\uD809[\uDC00-\uDC6E\uDC70-\uDC74]'
  3602. },
  3603. {
  3604. name: 'Cypriot',
  3605. astral: '\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F]'
  3606. },
  3607. {
  3608. name: 'Cyrillic',
  3609. bmp: '\u0400-\u0484\u0487-\u052F\u1D2B\u1D78\u2DE0-\u2DFF\uA640-\uA69D\uA69F'
  3610. },
  3611. {
  3612. name: 'Deseret',
  3613. astral: '\uD801[\uDC00-\uDC4F]'
  3614. },
  3615. {
  3616. name: 'Devanagari',
  3617. bmp: '\u0900-\u0950\u0953-\u0963\u0966-\u097F\uA8E0-\uA8FB'
  3618. },
  3619. {
  3620. name: 'Duployan',
  3621. astral: '\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99\uDC9C-\uDC9F]'
  3622. },
  3623. {
  3624. name: 'Egyptian_Hieroglyphs',
  3625. astral: '\uD80C[\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]'
  3626. },
  3627. {
  3628. name: 'Elbasan',
  3629. astral: '\uD801[\uDD00-\uDD27]'
  3630. },
  3631. {
  3632. name: 'Ethiopic',
  3633. 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'
  3634. },
  3635. {
  3636. name: 'Georgian',
  3637. bmp: '\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u10FF\u2D00-\u2D25\u2D27\u2D2D'
  3638. },
  3639. {
  3640. name: 'Glagolitic',
  3641. bmp: '\u2C00-\u2C2E\u2C30-\u2C5E'
  3642. },
  3643. {
  3644. name: 'Gothic',
  3645. astral: '\uD800[\uDF30-\uDF4A]'
  3646. },
  3647. {
  3648. name: 'Grantha',
  3649. astral: '\uD804[\uDF01-\uDF03\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3C-\uDF44\uDF47\uDF48\uDF4B-\uDF4D\uDF57\uDF5D-\uDF63\uDF66-\uDF6C\uDF70-\uDF74]'
  3650. },
  3651. {
  3652. name: 'Greek',
  3653. bmp: '\u0370-\u0373\u0375-\u0377\u037A-\u037D\u037F\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\uAB65',
  3654. astral: '\uD800[\uDD40-\uDD8C\uDDA0]|\uD834[\uDE00-\uDE45]'
  3655. },
  3656. {
  3657. name: 'Gujarati',
  3658. 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'
  3659. },
  3660. {
  3661. name: 'Gurmukhi',
  3662. 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'
  3663. },
  3664. {
  3665. name: 'Han',
  3666. bmp: '\u2E80-\u2E99\u2E9B-\u2EF3\u2F00-\u2FD5\u3005\u3007\u3021-\u3029\u3038-\u303B\u3400-\u4DB5\u4E00-\u9FCC\uF900-\uFA6D\uFA70-\uFAD9',
  3667. astral: '[\uD840-\uD868\uD86A-\uD86C][\uDC00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD87E[\uDC00-\uDE1D]'
  3668. },
  3669. {
  3670. name: 'Hangul',
  3671. 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'
  3672. },
  3673. {
  3674. name: 'Hanunoo',
  3675. bmp: '\u1720-\u1734'
  3676. },
  3677. {
  3678. name: 'Hebrew',
  3679. bmp: '\u0591-\u05C7\u05D0-\u05EA\u05F0-\u05F4\uFB1D-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFB4F'
  3680. },
  3681. {
  3682. name: 'Hiragana',
  3683. bmp: '\u3041-\u3096\u309D-\u309F',
  3684. astral: '\uD82C\uDC01|\uD83C\uDE00'
  3685. },
  3686. {
  3687. name: 'Imperial_Aramaic',
  3688. astral: '\uD802[\uDC40-\uDC55\uDC57-\uDC5F]'
  3689. },
  3690. {
  3691. name: 'Inherited',
  3692. bmp: '\u0300-\u036F\u0485\u0486\u064B-\u0655\u0670\u0951\u0952\u1AB0-\u1ABE\u1CD0-\u1CD2\u1CD4-\u1CE0\u1CE2-\u1CE8\u1CED\u1CF4\u1CF8\u1CF9\u1DC0-\u1DF5\u1DFC-\u1DFF\u200C\u200D\u20D0-\u20F0\u302A-\u302D\u3099\u309A\uFE00-\uFE0F\uFE20-\uFE2D',
  3693. astral: '\uD834[\uDD67-\uDD69\uDD7B-\uDD82\uDD85-\uDD8B\uDDAA-\uDDAD]|\uD800[\uDDFD\uDEE0]|\uDB40[\uDD00-\uDDEF]'
  3694. },
  3695. {
  3696. name: 'Inscriptional_Pahlavi',
  3697. astral: '\uD802[\uDF60-\uDF72\uDF78-\uDF7F]'
  3698. },
  3699. {
  3700. name: 'Inscriptional_Parthian',
  3701. astral: '\uD802[\uDF40-\uDF55\uDF58-\uDF5F]'
  3702. },
  3703. {
  3704. name: 'Javanese',
  3705. bmp: '\uA980-\uA9CD\uA9D0-\uA9D9\uA9DE\uA9DF'
  3706. },
  3707. {
  3708. name: 'Kaithi',
  3709. astral: '\uD804[\uDC80-\uDCC1]'
  3710. },
  3711. {
  3712. name: 'Kannada',
  3713. bmp: '\u0C81-\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'
  3714. },
  3715. {
  3716. name: 'Katakana',
  3717. bmp: '\u30A1-\u30FA\u30FD-\u30FF\u31F0-\u31FF\u32D0-\u32FE\u3300-\u3357\uFF66-\uFF6F\uFF71-\uFF9D',
  3718. astral: '\uD82C\uDC00'
  3719. },
  3720. {
  3721. name: 'Kayah_Li',
  3722. bmp: '\uA900-\uA92D\uA92F'
  3723. },
  3724. {
  3725. name: 'Kharoshthi',
  3726. astral: '\uD802[\uDE00-\uDE03\uDE05\uDE06\uDE0C-\uDE13\uDE15-\uDE17\uDE19-\uDE33\uDE38-\uDE3A\uDE3F-\uDE47\uDE50-\uDE58]'
  3727. },
  3728. {
  3729. name: 'Khmer',
  3730. bmp: '\u1780-\u17DD\u17E0-\u17E9\u17F0-\u17F9\u19E0-\u19FF'
  3731. },
  3732. {
  3733. name: 'Khojki',
  3734. astral: '\uD804[\uDE00-\uDE11\uDE13-\uDE3D]'
  3735. },
  3736. {
  3737. name: 'Khudawadi',
  3738. astral: '\uD804[\uDEB0-\uDEEA\uDEF0-\uDEF9]'
  3739. },
  3740. {
  3741. name: 'Lao',
  3742. 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'
  3743. },
  3744. {
  3745. name: 'Latin',
  3746. bmp: 'A-Za-z\xAA\xBA\xC0-\xD6\xD8-\xF6\xF8-\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-\uA7AD\uA7B0\uA7B1\uA7F7-\uA7FF\uAB30-\uAB5A\uAB5C-\uAB5F\uAB64\uFB00-\uFB06\uFF21-\uFF3A\uFF41-\uFF5A'
  3747. },
  3748. {
  3749. name: 'Lepcha',
  3750. bmp: '\u1C00-\u1C37\u1C3B-\u1C49\u1C4D-\u1C4F'
  3751. },
  3752. {
  3753. name: 'Limbu',
  3754. bmp: '\u1900-\u191E\u1920-\u192B\u1930-\u193B\u1940\u1944-\u194F'
  3755. },
  3756. {
  3757. name: 'Linear_A',
  3758. astral: '\uD801[\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]'
  3759. },
  3760. {
  3761. name: 'Linear_B',
  3762. astral: '\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA]'
  3763. },
  3764. {
  3765. name: 'Lisu',
  3766. bmp: '\uA4D0-\uA4FF'
  3767. },
  3768. {
  3769. name: 'Lycian',
  3770. astral: '\uD800[\uDE80-\uDE9C]'
  3771. },
  3772. {
  3773. name: 'Lydian',
  3774. astral: '\uD802[\uDD20-\uDD39\uDD3F]'
  3775. },
  3776. {
  3777. name: 'Mahajani',
  3778. astral: '\uD804[\uDD50-\uDD76]'
  3779. },
  3780. {
  3781. name: 'Malayalam',
  3782. bmp: '\u0D01-\u0D03\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D-\u0D44\u0D46-\u0D48\u0D4A-\u0D4E\u0D57\u0D60-\u0D63\u0D66-\u0D75\u0D79-\u0D7F'
  3783. },
  3784. {
  3785. name: 'Mandaic',
  3786. bmp: '\u0840-\u085B\u085E'
  3787. },
  3788. {
  3789. name: 'Manichaean',
  3790. astral: '\uD802[\uDEC0-\uDEE6\uDEEB-\uDEF6]'
  3791. },
  3792. {
  3793. name: 'Meetei_Mayek',
  3794. bmp: '\uAAE0-\uAAF6\uABC0-\uABED\uABF0-\uABF9'
  3795. },
  3796. {
  3797. name: 'Mende_Kikakui',
  3798. astral: '\uD83A[\uDC00-\uDCC4\uDCC7-\uDCD6]'
  3799. },
  3800. {
  3801. name: 'Meroitic_Cursive',
  3802. astral: '\uD802[\uDDA0-\uDDB7\uDDBE\uDDBF]'
  3803. },
  3804. {
  3805. name: 'Meroitic_Hieroglyphs',
  3806. astral: '\uD802[\uDD80-\uDD9F]'
  3807. },
  3808. {
  3809. name: 'Miao',
  3810. astral: '\uD81B[\uDF00-\uDF44\uDF50-\uDF7E\uDF8F-\uDF9F]'
  3811. },
  3812. {
  3813. name: 'Modi',
  3814. astral: '\uD805[\uDE00-\uDE44\uDE50-\uDE59]'
  3815. },
  3816. {
  3817. name: 'Mongolian',
  3818. bmp: '\u1800\u1801\u1804\u1806-\u180E\u1810-\u1819\u1820-\u1877\u1880-\u18AA'
  3819. },
  3820. {
  3821. name: 'Mro',
  3822. astral: '\uD81A[\uDE40-\uDE5E\uDE60-\uDE69\uDE6E\uDE6F]'
  3823. },
  3824. {
  3825. name: 'Myanmar',
  3826. bmp: '\u1000-\u109F\uA9E0-\uA9FE\uAA60-\uAA7F'
  3827. },
  3828. {
  3829. name: 'Nabataean',
  3830. astral: '\uD802[\uDC80-\uDC9E\uDCA7-\uDCAF]'
  3831. },
  3832. {
  3833. name: 'New_Tai_Lue',
  3834. bmp: '\u1980-\u19AB\u19B0-\u19C9\u19D0-\u19DA\u19DE\u19DF'
  3835. },
  3836. {
  3837. name: 'Nko',
  3838. bmp: '\u07C0-\u07FA'
  3839. },
  3840. {
  3841. name: 'Ogham',
  3842. bmp: '\u1680-\u169C'
  3843. },
  3844. {
  3845. name: 'Ol_Chiki',
  3846. bmp: '\u1C50-\u1C7F'
  3847. },
  3848. {
  3849. name: 'Old_Italic',
  3850. astral: '\uD800[\uDF00-\uDF23]'
  3851. },
  3852. {
  3853. name: 'Old_North_Arabian',
  3854. astral: '\uD802[\uDE80-\uDE9F]'
  3855. },
  3856. {
  3857. name: 'Old_Permic',
  3858. astral: '\uD800[\uDF50-\uDF7A]'
  3859. },
  3860. {
  3861. name: 'Old_Persian',
  3862. astral: '\uD800[\uDFA0-\uDFC3\uDFC8-\uDFD5]'
  3863. },
  3864. {
  3865. name: 'Old_South_Arabian',
  3866. astral: '\uD802[\uDE60-\uDE7F]'
  3867. },
  3868. {
  3869. name: 'Old_Turkic',
  3870. astral: '\uD803[\uDC00-\uDC48]'
  3871. },
  3872. {
  3873. name: 'Oriya',
  3874. 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'
  3875. },
  3876. {
  3877. name: 'Osmanya',
  3878. astral: '\uD801[\uDC80-\uDC9D\uDCA0-\uDCA9]'
  3879. },
  3880. {
  3881. name: 'Pahawh_Hmong',
  3882. astral: '\uD81A[\uDF00-\uDF45\uDF50-\uDF59\uDF5B-\uDF61\uDF63-\uDF77\uDF7D-\uDF8F]'
  3883. },
  3884. {
  3885. name: 'Palmyrene',
  3886. astral: '\uD802[\uDC60-\uDC7F]'
  3887. },
  3888. {
  3889. name: 'Pau_Cin_Hau',
  3890. astral: '\uD806[\uDEC0-\uDEF8]'
  3891. },
  3892. {
  3893. name: 'Phags_Pa',
  3894. bmp: '\uA840-\uA877'
  3895. },
  3896. {
  3897. name: 'Phoenician',
  3898. astral: '\uD802[\uDD00-\uDD1B\uDD1F]'
  3899. },
  3900. {
  3901. name: 'Psalter_Pahlavi',
  3902. astral: '\uD802[\uDF80-\uDF91\uDF99-\uDF9C\uDFA9-\uDFAF]'
  3903. },
  3904. {
  3905. name: 'Rejang',
  3906. bmp: '\uA930-\uA953\uA95F'
  3907. },
  3908. {
  3909. name: 'Runic',
  3910. bmp: '\u16A0-\u16EA\u16EE-\u16F8'
  3911. },
  3912. {
  3913. name: 'Samaritan',
  3914. bmp: '\u0800-\u082D\u0830-\u083E'
  3915. },
  3916. {
  3917. name: 'Saurashtra',
  3918. bmp: '\uA880-\uA8C4\uA8CE-\uA8D9'
  3919. },
  3920. {
  3921. name: 'Sharada',
  3922. astral: '\uD804[\uDD80-\uDDC8\uDDCD\uDDD0-\uDDDA]'
  3923. },
  3924. {
  3925. name: 'Shavian',
  3926. astral: '\uD801[\uDC50-\uDC7F]'
  3927. },
  3928. {
  3929. name: 'Siddham',
  3930. astral: '\uD805[\uDD80-\uDDB5\uDDB8-\uDDC9]'
  3931. },
  3932. {
  3933. name: 'Sinhala',
  3934. bmp: '\u0D82\u0D83\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0DCA\u0DCF-\u0DD4\u0DD6\u0DD8-\u0DDF\u0DE6-\u0DEF\u0DF2-\u0DF4',
  3935. astral: '\uD804[\uDDE1-\uDDF4]'
  3936. },
  3937. {
  3938. name: 'Sora_Sompeng',
  3939. astral: '\uD804[\uDCD0-\uDCE8\uDCF0-\uDCF9]'
  3940. },
  3941. {
  3942. name: 'Sundanese',
  3943. bmp: '\u1B80-\u1BBF\u1CC0-\u1CC7'
  3944. },
  3945. {
  3946. name: 'Syloti_Nagri',
  3947. bmp: '\uA800-\uA82B'
  3948. },
  3949. {
  3950. name: 'Syriac',
  3951. bmp: '\u0700-\u070D\u070F-\u074A\u074D-\u074F'
  3952. },
  3953. {
  3954. name: 'Tagalog',
  3955. bmp: '\u1700-\u170C\u170E-\u1714'
  3956. },
  3957. {
  3958. name: 'Tagbanwa',
  3959. bmp: '\u1760-\u176C\u176E-\u1770\u1772\u1773'
  3960. },
  3961. {
  3962. name: 'Tai_Le',
  3963. bmp: '\u1950-\u196D\u1970-\u1974'
  3964. },
  3965. {
  3966. name: 'Tai_Tham',
  3967. bmp: '\u1A20-\u1A5E\u1A60-\u1A7C\u1A7F-\u1A89\u1A90-\u1A99\u1AA0-\u1AAD'
  3968. },
  3969. {
  3970. name: 'Tai_Viet',
  3971. bmp: '\uAA80-\uAAC2\uAADB-\uAADF'
  3972. },
  3973. {
  3974. name: 'Takri',
  3975. astral: '\uD805[\uDE80-\uDEB7\uDEC0-\uDEC9]'
  3976. },
  3977. {
  3978. name: 'Tamil',
  3979. 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'
  3980. },
  3981. {
  3982. name: 'Telugu',
  3983. bmp: '\u0C00-\u0C03\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55\u0C56\u0C58\u0C59\u0C60-\u0C63\u0C66-\u0C6F\u0C78-\u0C7F'
  3984. },
  3985. {
  3986. name: 'Thaana',
  3987. bmp: '\u0780-\u07B1'
  3988. },
  3989. {
  3990. name: 'Thai',
  3991. bmp: '\u0E01-\u0E3A\u0E40-\u0E5B'
  3992. },
  3993. {
  3994. name: 'Tibetan',
  3995. bmp: '\u0F00-\u0F47\u0F49-\u0F6C\u0F71-\u0F97\u0F99-\u0FBC\u0FBE-\u0FCC\u0FCE-\u0FD4\u0FD9\u0FDA'
  3996. },
  3997. {
  3998. name: 'Tifinagh',
  3999. bmp: '\u2D30-\u2D67\u2D6F\u2D70\u2D7F'
  4000. },
  4001. {
  4002. name: 'Tirhuta',
  4003. astral: '\uD805[\uDC80-\uDCC7\uDCD0-\uDCD9]'
  4004. },
  4005. {
  4006. name: 'Ugaritic',
  4007. astral: '\uD800[\uDF80-\uDF9D\uDF9F]'
  4008. },
  4009. {
  4010. name: 'Vai',
  4011. bmp: '\uA500-\uA62B'
  4012. },
  4013. {
  4014. name: 'Warang_Citi',
  4015. astral: '\uD806[\uDCA0-\uDCF2\uDCFF]'
  4016. },
  4017. {
  4018. name: 'Yi',
  4019. bmp: '\uA000-\uA48C\uA490-\uA4C6'
  4020. }
  4021. ]);
  4022. }(XRegExp));
  4023. return XRegExp;
  4024. }));